在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ js數(shù)據(jù)合并問題

js數(shù)據(jù)合并問題

根據(jù)key合并ab的數(shù)據(jù)得到result,代碼怎么寫性能好?要考慮實際數(shù)據(jù)比這個多幾層嵌套。

const a = [
  {
    key: "id",
    num: "111",
  },
  {
    key: "age",
    num: "222",
  }
];

const b = [
  {
    key: "age",
    initVal: "23"
  },
  {
    key: "id",
    initVal: "001"
  }
];

const result = [
  {
    key: "id",
    initVal: "001",
    num: "111",
  },
  {
    key: "age",
    initVal: "23",
    num: "222",
  }
];
回答
編輯回答
安若晴

oneliner 又來湊熱鬧... 供參考

const merge = (a,b) =>[...a.concat(b).reduce((m, x) => m.set(x.key, Object.assign(m.get(x.key) || {}, x)), new Map()).values()]
const a = [ { key: "id", num: "111", }, { key: "age", num: "222", } ]
const b = [ { key: "age", initVal: "23" }, { key: "id", initVal: "001" } ]

console.log(merge(a,b))
2017年11月23日 09:36
編輯回答
北城荒

只提供個思路

  • 如果兩個數(shù)組按key對應(yīng),可以先做排序(已經(jīng)是相同的順序則不需要),然后直接過一遍merge
  • 如果不是,則按照第一個回答,用一個中間對象做映射,然后返回merge后的b對象
2017年10月15日 17:10
編輯回答
陌顏

如果你允許修改a或者b中的值,那么可以這樣

// 新建對象放入a的數(shù)據(jù)
const data = {};

// 用key值做屬性加速查找
a.forEach(item => {
    data[item.key] = item;
})

// 將a的數(shù)據(jù)合并到b
b.forEach(item => {
    Object.assign(item, data[item.key]);
})

// 得到結(jié)果
console.log(b);

如果不允許,那么

// result數(shù)組用于存放結(jié)果
const result = [];

// 同上
const data = {};
a.forEach(item => {
    data[item.key] = item;
})

// 遍歷b,合并數(shù)據(jù)到新對象后插入result中
b.forEach(item => {
    result.push(Object.assign({}, data[item.key], item));
})

console.log(result);
2018年7月22日 22:29
編輯回答
奧特蛋

如果多個數(shù)組之間的對象順序是嚴(yán)格對應(yīng)的,可以用 Lodash 的 _.merge,如果不是,就這樣:

/**
 * @param keyName 用于對應(yīng)多個數(shù)組中對象的 key 字段名稱
 * @param first 第一個數(shù)據(jù)
 * @param args 剩下的一個或多個數(shù)組
 */
function merge(keyName, first, ...args) {
    // 這里假設(shè)數(shù)組內(nèi)就是普通對象,如果是多層次的對象,理論上來說應(yīng)該用深拷貝
    // 不過具體用淺拷貝還是深拷貝,要看實際需求
    const result = first.map(m => ({ ...m }));

    // 根據(jù) key 建立一個映射表,方面后面快速檢索
    const map = result.reduce((agg, m) => {
        agg[m[keyName]] = m;
        return agg
    }, {});
    
    // 每個 next 就是一個數(shù)組
    for (let next of args) {
        // 遍歷數(shù)組中的每一個對象 m
        for (let m of next) {
            // 根據(jù) key 找到已經(jīng)存在的模型
            let model = map[m[keyName]];
            if (model) {
                // 如果找到了,就直接將 m 合并到模型中去
                Object.assign(model, m);
            } else {
                // 沒找到就按新 key 建立新的模型,這里和上面一樣,理論上來說應(yīng)該用深拷貝
                map[m[keyName]] = { ...m };
            } 
        }
    }
    return result;
}
2018年7月4日 14:45
編輯回答
浪婳
function selectKey(key) {
    // 使用es6數(shù)組實例的find方法
    const result_a = a.find(elem => elem.key == key)
    const result_b = b.find(elem => elem.key == key)
    return { ...result_a, ...result_b }
}

const result = a.map(elem => selectKey(elem.key))
2018年2月11日 01:55