为什么下划线的区别仅在于一种方式

时间:2014-03-31 13:11:39

标签: javascript arrays underscore.js difference

如果我要说“这些数组有什么区别?['a']和['a','b']?”你会说'b'对吗?

我想知道下划线默认没有双向差异的原因是什么?你将如何结合其他方法来实现这一目标?

var a = ['js-email'],
    b = ['js-email', 'form-group'],
    c = _.difference(a, b), // result: []
    d = _.difference(b, a); // result: ["form-group"]

http://jsfiddle.net/GH59u/1/

澄清我希望差异始终等于['form-group'],无论数组的传递顺序如何。

3 个答案:

答案 0 :(得分:5)

您可以在两个方向上合并两个项目之间的差异。

function absDifference(first, second) {
    return _.union(_.difference(first, second), _.difference(second, first));
}

console.assert(absDifference(["a", "b"], ["a", "c"]).toString() == "b,c");
var a = ["js-email"], b = ["js-email", "form-group"];
console.assert(absDifference(a, b).toString() == "form-group");

如果您希望在整个项目期间将其作为_库本身的一部分提供,那么您可以像这样使用_.mixin

_.mixin({
    absDifference: function(first, second) {
        return _.union(_.difference(first, second), _.difference(second, first));
    }
});

然后

console.assert(_.absDifference(["a", "b"], ["a", "c"]).toString() == "b,c");
var a = ["js-email"],
    b = ["js-email", "form-group"];
console.assert(_.absDifference(a, b).toString() == "form-group");

答案 1 :(得分:2)

.difference,就像PHP的array_diff函数和其他类似函数一样,返回第一个数组中的所有项目,这些项目不会出现在传递给它的任何其他数组中。

这意味着“那些不在b中的东西”与“b中不存在的东西”有很大的不同,并且有充分的理由 - 这是预期的行为。

如果你想要什么本质上是双向差异,你需要双向运行该函数,然后在结果中删除重复项。

答案 2 :(得分:0)

_.difference接受可变数量的数组作为参数:

  

与without类似,但返回数组中不存在于其他数组中的值

因此它只允许按设计进行单向操作。