javascript使用.filter()返回新的唯一元素数组

时间:2016-05-30 17:27:28

标签: javascript comparison-operators

我编写了代码来返回一个只包含两个单独数组的唯一元素的新数组。例如:[1,2,3]和[1,2]将返回3.我有工作代码,但我只想解释为什么这在使用'!'时有效在我的退货声明之前:

function diffArray(arr1, arr2) {
  return arr1.concat(arr2).filter(function(val){
    return !(arr1.indexOf(val) >= 0 && arr2.indexOf(val) >= 0)
  });
}

diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]);

但这不是:

function diffArray(arr1, arr2) {
  return arr1.concat(arr2).filter(function(val){
    return arr1.indexOf(val) < 0 && arr2.indexOf(val) < 0
  });
}

diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]);

我的印象是'!'只会反转表达式,所以排除它并使用'&lt;'而不是'&gt; ='应该返回相同的值。

2 个答案:

答案 0 :(得分:4)

根据De Morgan's laws,相当于表达式

!(arr1.indexOf(val) >= 0 && arr2.indexOf(val) >= 0)

(arr1.indexOf(val) < 0 || arr2.indexOf(val) < 0)
//                     ^^

答案 1 :(得分:2)

相反

a AND b大于0

不是

a AND b低于0

a OR b低于0

我相信这会奏效:

function diffArray(arr1, arr2) {
    return arr1.concat(arr2).filter(function(val){
        return arr1.indexOf(val) < 0 || arr2.indexOf(val) < 0
    });                            /*^^*/
}

diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]);