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

使用 javascript 更新对象值

使用 javascript 更新对象值

喵喵时光机 2021-08-20 10:18:51
我想知道如何使用 javascript 更新对象列表数组。如何更新objList与newObjList通过匹配id和name。如果id和name匹配,则更新objList嵌套数组对象。var result = updateObj(objList, newObjList);console.log(result);function updateObj(list, newObjList){  var flatarr = list.map(e=>Object.entries(e).map(([k, val]) => val)).flat(3);  var filterService =  newObjList.filter(e=>e.name=="service");  //got stuck}var newObjList=[{    "id": "service",    "name": "bank",    "amount": 2000},{    "id": "service",    "name": "credit",    "amount": 5000}]var objList=[{  "btob": [{    "id": "service",    "name": "bank",    "amount": 1000  },{    "id": "fund",    "name": "bank",    "amount": 2000  },{    "id": "others",    "name": "bank",    "amount": 5000   }]},{ "ctob":[{    "id": "service",    "name": "credit",    "amount": 1000,    "rate": 0.4  },{    "id": "fund",    "name": "credit",    "amount": 3000,    "rate": 0.2  },{    "id": "others",    "name": "credit",    "amount": 4000,    "rate": 0.6   }]  }]}]
查看完整描述

3 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

如果您想要一个完全不依赖于硬编码的解决方案 - 即没有"btob"或"ctob",您可以使用 a.map()来循环objList。对于其中的每个项目,循环遍历它的所有键/值对,并使用.find(). 这也使您的原始对象保持原样,而不是覆盖它。


考虑下面的示例,其中我添加了一个额外的键来演示可扩展性。


var newObj = [

  { "id": "service", "name": "bank", "amount": 2000 },

  { "id": "service", "name": "credit", "amount": 5000 },

  { "id": "test", "name": "test", "newKey": "Hello world!"}

]; 

var objList = [

  { "btob": [{ "id": "service", "name": "bank", "amount": 1000 },{ "id": "fund", "name": "bank", "amount": 2000 },{ "id": "others", "name": "bank", "amount": 5000 }] },

  { "ctob":[{ "id": "service", "name": "credit", "amount": 1000, "rate": 0.4 },{ "id": "fund", "name": "credit", "amount": 3000, "rate": 0.2 },{ "id": "others", "name": "credit", "amount": 4000, "rate": 0.6 }]}, 

  { "dtob": [{ "id": "test", "name": "test"}]}

];


let result = objList

  .map(root => Object.keys(root)

    .reduce((output,key) => (

      {...output, [key]: root[key]

        .flatMap(i => {

          let replacement = newObj.find(f => i.id === f.id && i.name === f.name);

          return replacement ? {...i, ...replacement} : i;

        })

      }

    ), {})

  );


console.log(result);


查看完整回答
反对 回复 2021-08-20
  • 3 回答
  • 0 关注
  • 398 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信