Javascript 如何基于更改的内部数组属性值进行部分深度合并
我正在尝试根据另一个关联的已更改值数组更新对象值数组。初始数组:Javascript 如何基于更改的内部数组属性值进行部分深度合并,javascript,ecmascript-6,lodash,Javascript,Ecmascript 6,Lodash,我正在尝试根据另一个关联的已更改值数组更新对象值数组。初始数组: const primaryArray = [ { name: 'Product Family 1', products: [ {name: 'product 1', selected: false}, {name: 'product 2', selected: false} ]}, { name: 'Product Family 2', products: [ {name: 'product 3',
const primaryArray = [
{
name: 'Product Family 1',
products: [ {name: 'product 1', selected: false}, {name: 'product 2', selected: false}
]},
{
name: 'Product Family 2',
products: [ {name: 'product 3', selected: false}, {name: 'product 4', selected: false}
]},
];
更新项目的数组:
const updates = [
{
name: 'Product Family 1',
products: [ {name: 'product 2', selected: true}]
},
{
name: 'Product Family 2',
products: [ {name: 'product 4', selected: true}]
},
];
基本上,只应在主阵列中更改更新阵列中列出的产品,同时仍保留现有的未更改产品
我尝试了Object.assign和uu.merge的多种变体,但由于primaryArray与“updates”数组中的元素数量不同,这些变体都无法正常工作,例如:
const newArray = primaryArray.forEach(obj => {
return (updates.find(o => o.name === obj.name) || obj);
});
我还尝试了多种组合使用.map.find和.forEach的方法,但没有任何运气
预期结果应该是:
const newArray = [
{
name: 'Product Family 1',
products: [ {name: 'product 1', selected: false}, {name: 'product 2', selected: true}
]},
{
name: 'Product Family 2',
products: [ {name: 'product 3', selected: false}, {name: 'product 4', selected: true}
]},
....
// where the new Array will also inherit all other objects from the primaryArray
name: 'Product Family 102',
products: [ {name: 'product 1000', selected: false}
]},
];
我首先将
更新转换为哈希表:
const updateByName = {};
for(const { name, products } of updates)
for(const {name: inner, selected } of products)
updateByName[name + " > " + inner] = selected;
更新过程非常简单,如下所示:
const result = primaryArray.map(({ name, products }) => ({
name,
products: products.map(({ name: inner, selected }) => {
const update = updateByName[name + " > " + inner];
return {
name: inner,
selected: update !== undefined ? update : selected,
};
})),
}));
这将稍微更优雅一些,很快就可以使用。注意:“更新”数组的格式不是一成不变的,如果有帮助的话,它的“产品”属性可以改为字符串数组(产品名称)。这太棒了,谢谢Jonas!关于如何使用哈希表以及为什么使用哈希表,仍然有点模糊,但这非常有效。