underscore.js - 确定数组数组中的所有值是否匹配

时间:2012-04-11 16:57:42

标签: javascript underscore.js

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

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

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

有人有想法吗?

9 个答案:

答案 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)

我使用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);
}

答案 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;
    });
}