我编写了代码来返回一个只包含两个单独数组的唯一元素的新数组。例如:[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; ='应该返回相同的值。
答案 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]);