19

我有一个数组数组,看起来像这样:

[["Some string", "Some other string"],["Some third string", "some fourth string"]]

我想我可以使用Underscore_.all中的方法来确定是否所有数组都匹配 100%(即它们的所有值都匹配),但我不确定如何编写所需的迭代器来运行检查。

有人有想法吗?

4

9 回答 9

31

为什么不是交叉路口?(如果你真的想为此使用一些下划线函数) http://underscorejs.org/#intersection

如果数组的长度相同,并且交集的长度等于数组的长度,那么它们都包含相同的值。

于 2012-04-11T17:26:09.610 回答
22

我的偏好:

_.isEqual(_.sortBy(first), _.sortBy(second))

如果订单很重要:

_(first).isEqual(second)
于 2015-01-10T23:40:04.313 回答
14

试试这个人(与订单无关):

function allArraysAlike(arrays) {
  return _.all(arrays, function(array) {
    return array.length == arrays[0].length && _.difference(array, arrays[0]).length == 0;
  });
}

这是假设您希望所有数组以彼此相同的顺序false包含所有相同的元素(因此对于您的示例输入,函数应该返回)。

于 2012-04-11T17:05:49.250 回答
11

使用下划线确定两者之间的差异,并检查数组的长度。一个简单的方法是:

_.isEmpty(_.difference(array1, array2)) && _.isEmpty(_.difference(array2, array1))

true如果它们相同或不同,这将返回false

于 2014-05-13T02:12:20.277 回答
4
_.isEmpty(_.xor(array1, array2))
于 2014-07-22T14:03:37.887 回答
2

如果您想检查元素是否相同且顺序相同,我会选择:

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]
于 2012-07-03T07:37:31.397 回答
2

我使用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);
}
于 2017-02-02T13:53:15.823 回答
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
于 2014-01-12T23:52:33.187 回答
0

我无法评论 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;
    });
}
于 2015-03-04T15:24:38.723 回答