为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕田峪4524236 2019-03-15 14:15:04
//老数组{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的值替换老数组的值。感谢~~
查看完整描述

4 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

方法一,直接遍历搜寻


//老数组

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

    }

});


查看完整回答
反对 回复 2019-03-21
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

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

查看完整回答
反对 回复 2019-03-21
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

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 } ]


查看完整回答
反对 回复 2019-03-21
  • 4 回答
  • 0 关注
  • 1509 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号