数组比较,用新数组覆盖老数组值

圈UU
  • 40
//老数组
{form_id: 1, field_id: 10, data: "215", member_id: 101}
{form_id: 12, field_id: 2, data: "215212", member_id: 101}
{form_id: 2, field_id: 31, data: "123", member_id: 101}
//新数组
{form_id: 2, field_id: 31, data: "123321", member_id: 101}

需求:
在老数组中找出form_id、field_id、member_id值与新数组对应值相同的数组,然后用新数组中data的值替换老数组的值。

感谢~~

回复
阅读 1.4k
4 个回答
✓ 已被采纳

方法一,直接遍历搜寻

//老数组
const olds = [
    { form_id: 1, field_id: 10, data: "215", member_id: 101 },
    { form_id: 12, field_id: 2, data: "215212", member_id: 101 },
    { form_id: 2, field_id: 31, data: "123", member_id: 101 }
];

//新数组
const news = [
    { form_id: 2, field_id: 31, data: "123321", member_id: 101 }
];


function itemEquals(a, b) {
    return a.form_id === b.form_id
        && a.field_id === b.field_id
        && a.member_id === b.member_id
}

// 遍历旧数据,对每个元素去遍历新数组,查找是否有对应数据
olds.forEach(item => {
    const found = news.find(n => itemEquals(n, item));
    if (found) {
        item.data = found.data;
    }
});

console.log(olds);

上面的方面在新数据较大的时候,查询效率会比较低,那就可以采用拼接唯一ID的方法来处理


// 根据几个属性生成唯一键,注意间隔字符的选中,一定不能造成歧义
function unique(item) {
    return `${item.form_id}-${item.field_id}-${item.member_id}`;
}

const dict = news.reduce((dict, item) => {
    dict[unique(item)] = item;
    return dict;
}, {});


olds.forEach(item => {
    const found = dict[unique(item)];
    if (found) {
        item.data = found.data
    }
});

貌似没什么特殊的哈,嵌套一个循环不就好了

var arr = [
    {k:1,v:'1'},
    {k:2,v:'2'},
    {k:3,v:'3'}
]
var narr = [
    {k:2,v:'22'},
    {k:3,v:'33'}
]
narr.forEach(n=>{
    arr.forEach(o=>{
        if(o.k == n.k){
            o.v = n.v
        }
    })
})
console.log(arr);

提供一个思路。如果数组元素比较少,可以穷举遍历,三层循环,复杂度较高。
如果数组元素比较多,可以考虑用空间换时间。将新数组转成容易查找的数据结构,比如多维数组,多层map,树,等,然后遍历老数组,一边遍历一边比较,找到一个就设置,找不到就跳过

let oldArray = [
  {form_id: 1, field_id: 10, data: "215", member_id: 101},
  {form_id: 12, field_id: 2, data: "215212", member_id: 101},
  {form_id: 2, field_id: 31, data: "123", member_id: 101}
];

let newArray = [{form_id: 2, field_id: 31, data: "123321", member_id: 101}];

for (let i = 0; i < oldArray.length; i++) {
  for (let a of newArray) {
    const o = oldArray[i];
    if (o.form_id === a.form_id && o.field_id === a.field_id && o.member_id === a.member_id) {
      oldArray[i].data = a.data;
    }
  }
}

console.log(oldArray);

输出:

[ { form_id: 1, field_id: 10, data: '215', member_id: 101 },
  { form_id: 12, field_id: 2, data: '215212', member_id: 101 },
  { form_id: 2, field_id: 31, data: '123321', member_id: 101 } ]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏