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!关于如何使用哈希表以及为什么使用哈希表,仍然有点模糊,但这非常有效。