我有一个数组数组,看起来像这样:
[["Some string", "Some other string"],["Some third string", "some fourth string"]]
我想我可以使用Underscore中的_.all
方法确定所有数组是否匹配100%(即它们的所有值都匹配),但我不确定如何写运行检查所需的迭代器。
有人有想法吗?
答案 0 :(得分:31)
为什么不交? (如果你真的想使用一些Underscore函数) http://underscorejs.org/#intersection
如果数组的长度相同,并且交集的长度等于数组的长度,那么它们都包含相同的值。
答案 1 :(得分:21)
我的偏好:
_.isEqual(_.sortBy(first), _.sortBy(second))
如果订单很重要:
_(first).isEqual(second)
答案 2 :(得分:14)
试试这个人(与订单无关):
function allArraysAlike(arrays) {
return _.all(arrays, function(array) {
return array.length == arrays[0].length && _.difference(array, arrays[0]).length == 0;
});
}
这假设您希望所有数组以相同的顺序包含所有相同的元素(因此对于您的示例输入,函数应该返回false
)。 / p>
答案 3 :(得分:11)
使用下划线确定两者之间的差异,并检查数组的长度。一个简单的方法是:
_.isEmpty(_.difference(array1, array2)) && _.isEmpty(_.difference(array2, array1))
如果它们相同,则返回true
,如果不相同,则返回false
。
答案 4 :(得分:4)
_.isEmpty(_.xor(array1, array2))
答案 5 :(得分:2)
如果你想检查元素是否相同且顺序相同,我会选择:
arrayEq = function(a, b) {
return _.all(_.zip(a, b), function(x) {
return x[0] === x[1];
});
};
在coffeescript中更加整洁:
arrayEq = (a,b) ->
_.all _.zip(a,b), (x) -> x[0]==x[1]
答案 6 :(得分:2)
/**
* Returns true if the arrays are equal
*
* @param {Array} array1
* @param {Array} array2
* @returns {boolean}
*/
equal: function ( array1, array2 )
{
return ( array1.length === array2.length)
&& (array1.length === _.intersection( array1, array2 ).length);
}
答案 7 :(得分:0)
如果您不需要知道哪些元素不相等,请使用及物性:
function allEqual(list) {
return _.all(list.slice(1), _.partial(_.isEqual, list[0]));
}
allEqual([2, 2, 2, 2]) //=> true
allEqual([2, 2, 3, 2]) //=> false
allEqual([false]) //=> true
allEqual([]) //=> true
答案 8 :(得分:0)
我不能评论丹涛的回答,小的改变,跳过检查第一个阵列对自己(不必要的_.difference电话)
function allArraysAlike(arrays) {
return _.all(arrays, function(array) {
if(array === arrays[0]) return true;
return array.length == arrays[0].length && _.difference(array, arrays[0]).length == 0;
});
}