使用 lodash 合并数组内的数组

Posted

技术标签:

【中文标题】使用 lodash 合并数组内的数组【英文标题】:Union of array inside array using lodash 【发布时间】:2016-09-15 15:36:07 【问题描述】:

如何?

例如:

输入:

var x = [ [1,2,3,4], [5,6,7], [], [8,9], [] ];

预期输出:

x = [1,2,3,4,5,6,7,8,9];

目前我的代码执行以下操作:

return promise.map(someObjects, function (object)) 
    return anArrayOfElements();
).then(function (arrayOfArrayElements) 
    // I tried to use union but it can apply only on two arrays
    _.union(arrayOfArrayElements);
);

【问题讨论】:

你试过_.flatten吗? 是的,刚刚工作 .union(.flatten(x)) 查看developer.mozilla.org/en-US/docs/Web/javascript/Reference/… 中的“扁平化数组”示例。它完全符合您的要求:D 【参考方案1】:

只需使用原生函数 reduce 减少它

arr.reduce(function(previousValue, currentValue)  
    return previousValue.concat(currentValue);
, []);

这会将 reduce 回调函数应用于数组的每个元素,并针对您展示的用例进行归约。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

【讨论】:

【参考方案2】:

使用apply 方法将数组值作为参数传递:

var union = _.union.apply(null, arrayOfArrayElements);

[https://jsfiddle.net/qe5n89dh/]

【讨论】:

为什么我们将 null 作为参数传递? 因为我们不需要传递this(见apply定义)。【参考方案3】:

我能想到的最简单的解决方案就是使用concat

Array.prototype.concat.apply([], [ [1,2,3,4], [5,6,7],[], [8,9], []]);

会产生...

[ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

【讨论】:

Concat 不删除重复项,而是 lodash union 啊,我错过了它应该删除欺骗。【参考方案4】:

对我来说有效的答案,所有其他答案都有效,但是当我检查其他帖子时,他们只是使用了 loadash。我不知道帖子中提供的所有答案的最佳语法是什么。 现在使用下面的方法

_.uniq(_.flatten(x)); // x indicates arrayOfArrayObjects
// or, using chain
_(x).flatten().uniq().value();

感谢大家的回答。 :)

【讨论】:

以上是关于使用 lodash 合并数组内的数组的主要内容,如果未能解决你的问题,请参考以下文章

Lodash合并数组与字典对象键值

nodejs通过lodash合并去重由unixtime和Date组成的两个数组

vue 二维数组合并一维数组

vue 二维数组合并一维数组

vue 二维数组合并一维数组

使用 Lodash 进行深度合并