【问题标题】:Lodash merge two arrays with conditionsLodash 用条件合并两个数组
【发布时间】:2021-12-10 16:47:39
【问题描述】:

我有 2 个数组,如下所示:

const array1 = [{name: "1"}, {name: "2"}, {name: "3"}, {name: "4"}, {name: "4"}];
const array2 = [{name: "1"}, {name: "5"}, {name: "3"}, {name: "4"}, {name: "4"}, {name: "4"}, {name: "1"}, {name: "1"}, {name: "2"}];

预期输出是:

[{name: "1"}, {name: "2"}, {name: "3"}, {name: "4"}, {name: "4"}, {name: "5"}, {name: "4"}, {name: "1"}, {name: "1"}];

结果数组应该包含array1的所有元素 以及 array2 中尚未出现在 array1 中的那些元素

我尝试使用_.unionBy

_.unionBy(array1, array2, 'name')

但它只会产生一个带有 uniq 'name' 的数组

我们如何使用 lodash 实现这一点?

【问题讨论】:

  • “结果数组应包含数组 1 的所有元素以及数组 2 中尚未出现在数组 1 序列中的那些元素”并且预期的输出不匹配在一起。
  • 您问题中的“预期输出”“预期输出” 的描述不匹配 - 为什么会有name: 1 和@ 987654326@ 元素在末尾?
  • 当相同索引的元素不同时,我认为他想要来自 array1 和 array2 中的所有内容
  • @Andreas array1 包含 {name: "1"} 并且 array2 包含 {name: "1"} 并且因为它存在于 array1 的元素序列中,所以我们将其丢弃。 array2 有 {name: "1"}, {name: "1"}, {name: "2"} 不存在于 array1 的元素序列中(因为我们已经丢弃了匹配的 {name: "1"})我会详细描述
  • 为什么最后一项有{ name: "2" }

标签: javascript arrays lodash


【解决方案1】:

假设您不希望 { name: "2" } 作为结果集的最后一项,您可以计算分组项并添加想要的项。

const
    array1 = [{ name: "1" }, { name: "2" }, { name: "3" }, { name: "4" }, { name: "4" }],
    array2 = [{ name: "1" }, { name: "5" }, { name: "3" }, { name: "4" }, { name: "4"}, { name: "4" }, { name: "1" }, { name: "1" }, { name: "2" }],
    counts = {},
    result = array1.map(o => (counts[o.name] = (counts[o.name] || 0) + 1, o));

result.push(...array2.filter(o => !counts[o.name] || !counts[o.name]--));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案2】:

    您可以使用unionBy (lodash)

    let result = _.unionBy(array1 , array2, 'name');
    

    unionBy - https://docs-lodash.com/v4/union-by/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-08
      • 1970-01-01
      • 2019-12-06
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多