【问题标题】:javascript return new array of unique elements with .filter()javascript 使用 .filter() 返回新的唯一元素数组
【发布时间】:2016-05-30 17:27:28
【问题描述】:

我编写了代码来返回一个仅包含两个单独数组的唯一元素的新数组。示例:[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]);

我的印象是'!'只会反转表达式,因此排除它并使用 '=' 应该返回相同的值。

【问题讨论】:

  • 想想&amp;&amp; 运算符会发生什么。你认申请!在您的表达式中更改比较,但保留 AND 原样。

标签: javascript comparison-operators


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您链接到 De Morgan 参考。
【解决方案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]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-25
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    相关资源
    最近更新 更多