【问题标题】:merge 2 array and replace same key using lodash合并 2 个数组并使用 lodash 替换相同的键
【发布时间】:2021-12-04 17:20:12
【问题描述】:

我有这 2 个数组,

const firstArray = [
{
 key: 'a',
 value: 'a'
},
{
 key: 'b',
 value: 'b'
},
{
 key: 'c',
 value: 'c'
}
]

const secondArray = [
{
 key: 'b',
 value: 'd'
},
{
 key: 'c',
 value: 'e'
}
]

我想合并这两个数组,如果在第二个数组上找到相同的键,则第二个数组值将替换第一个数组值

新数组应如下所示

const expectedArray = [
{
 key: 'a',
 value: 'a'
},
{
 key: 'b',
 value: 'd'
},
{
 key: 'c',
 value: 'e'
}
]

【问题讨论】:

标签: javascript arrays lodash


【解决方案1】:

我在您的标签中看到lodash,我假设您想使用它。

你可以这样使用:

var merged = _(firstArray)
  .concat(secondArray)
  .groupBy("key")
  .map(_.spread(_.merge))
  .value();

它基本上将所有具有相同键的对象用groupBy("key") 分组到一个数组中,然后将每个值数组展平,将它们合并并用.map(_.spread(_.merge)) 取最后一个。

如果你想完全了解过程,我建议将最后的赞注释掉并查看所有中间步骤,这很有趣!

const firstArray = [{
    key: 'a',
    value: 'a'
  },
  {
    key: 'b',
    value: 'b'
  },
  {
    key: 'c',
    value: 'c'
  }
]

const secondArray = [{
    key: 'b',
    value: 'd'
  },
  {
    key: 'c',
    value: 'e'
  }
]

var merged = _(firstArray)
  .concat(secondArray)
  .groupBy("key")
  .map(_.spread(_.merge))
  .value();

console.log(merged);
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>

【讨论】:

  • 想询问_.spread(_.merge)。所以传播将为每个描述运行合并,对于key a,因为它只有一个对象,所以它只返回相同的对象,但是对于键 b 和 c,因为它在每个键中有 2 个对象,它将最后返回目的。我说的对吗?
  • 是的,此时每个映射数组的所有项目都将具有相同的 key 值,因此它不会改变,但对于 description(以及更多字段,如果有)它将合并它们all 并取最后一个值。
【解决方案2】:

没有lodash 的解决方案是遍历第二个数组并仅查找匹配项。

如果没有匹配,则将项目推送到第一个数组。

如果有匹配项,请将第一个数组中的项替换为第二个数组中的项。

const mergedArray = [...firstArray]

secondArray.forEach(newItem => {
  const matchIndex = mergedArray.findIndex(prevItem => prevItem.key === newItem.key)

  if (matchIndex === -1) {
    mergedArray.push(newItem)
  } else {
    mergedArray[matchIndex] = newItem
  }
})

【讨论】:

    【解决方案3】:
    const mergedArray = [...secondArray, ...firstArray];
    const lengthOfUniqueArray = new Set(mergedArray.map((item) => item.key)).size;
    const expectedArray = newArray.slice(0, lengthOfUniqueArray);
    

    expectedArray 将是您想要的。

    【讨论】:

    • 这将允许具有相同key 的多个项目在expectedArray 中,这不是这里所要求的。
    【解决方案4】:

    你可以通过key来concat、reverse、can所有唯一的元素,然后reverse回来:

    const { flow, concat, reverse, uniqBy } = _
    
    const mergeArrays = flow(
      concat,
      reverse,
      arr => uniqBy(arr, 'key'),
      reverse
    )
    
    const firstArray = [{"key":"a","value":"a"},{"key":"b","value":"b"},{"key":"c","value":"c"}]
    const secondArray = [{"key":"b","value":"d"},{"key":"c","value":"e"}]
    
    var merged = mergeArrays(firstArray, secondArray)
    
    console.log(merged)
    <script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>

    【讨论】:

    • 如果我不需要每个键都按相同的顺序,应该可以去掉反向吧?
    • 如果要从第二个数组中复制,则需要反向。
    猜你喜欢
    • 2018-09-06
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 2018-03-04
    相关资源
    最近更新 更多