我有一个数组数组,看起来像这样:
[["Some string", "Some other string"],["Some third string", "some fourth string"]]
我想我可以使用Underscore_.all
中的方法来确定是否所有数组都匹配 100%(即它们的所有值都匹配),但我不确定如何编写所需的迭代器来运行检查。
有人有想法吗?
我有一个数组数组,看起来像这样:
[["Some string", "Some other string"],["Some third string", "some fourth string"]]
我想我可以使用Underscore_.all
中的方法来确定是否所有数组都匹配 100%(即它们的所有值都匹配),但我不确定如何编写所需的迭代器来运行检查。
有人有想法吗?
为什么不是交叉路口?(如果你真的想为此使用一些下划线函数) http://underscorejs.org/#intersection
如果数组的长度相同,并且交集的长度等于数组的长度,那么它们都包含相同的值。
我的偏好:
_.isEqual(_.sortBy(first), _.sortBy(second))
如果订单很重要:
_(first).isEqual(second)
试试这个人(与订单无关):
function allArraysAlike(arrays) {
return _.all(arrays, function(array) {
return array.length == arrays[0].length && _.difference(array, arrays[0]).length == 0;
});
}
这是假设您希望所有数组以彼此相同的顺序false
包含所有相同的元素(因此对于您的示例输入,函数应该返回)。
使用下划线确定两者之间的差异,并检查数组的长度。一个简单的方法是:
_.isEmpty(_.difference(array1, array2)) && _.isEmpty(_.difference(array2, array1))
true
如果它们相同或不同,这将返回false
。
_.isEmpty(_.xor(array1, array2))
如果您想检查元素是否相同且顺序相同,我会选择:
arrayEq = function(a, b) {
return _.all(_.zip(a, b), function(x) {
return x[0] === x[1];
});
};
在咖啡脚本中更整洁:
arrayEq = (a,b) ->
_.all _.zip(a,b), (x) -> x[0]==x[1]
我使用http://underscorejs.org/的实现
/**
* 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);
}
如果您不需要知道哪些元素不相等,请使用传递性:
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
我无法评论 Dan Tao 的回答,小改动跳过了对自身的第一个数组检查(不必要的 _.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;
});
}