使用 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 合并数组内的数组的主要内容,如果未能解决你的问题,请参考以下文章