3 回答
![?](http://img1.sycdn.imooc.com/5333a0490001f9ff02200220-100-100.jpg)
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);
添加回答
举报