【问题标题】:Optimising ES6 intersection of Arrays function [duplicate]优化 ES6 数组的交集函数 [重复]
【发布时间】:2017-10-13 13:02:07
【问题描述】:

我有以下数组:

this.originalSelectedRows = [1,2,3,4,5];
this.selectedRows = [3,4,5,6,7,8];

我想知道以下内容:

this.originalSelectedRows 中有多少个数字,而this.selectedRows 中却没有

在本例中为 2:

1 和 2

this.selectedRows 中有多少个数字,但this.originalSelectedRows 没有

在这种情况下是 3:

6、7 和 8

我有以下,效果很好:

    let isOnListCount = 0;
    let isNotOnListCount = 0

    this.selectedRows.map((row) => {
      const isSelected = this.originalSelectedRows.filter(x => x === row);
        if(isSelected.length > 0)
          isOnListCount++;
        else
          isNotOnListCount++;
    });

但我想知道这是否可以使用 ES6 的一些新功能或原始 JS 以更简洁的方式实现

【问题讨论】:

标签: javascript ecmascript-6


【解决方案1】:

你可以把长度作为计数器,用普通项来减少值。

var array1 = [1, 2, 3, 4, 5],
    array2 = [3, 4, 5, 6, 7, 8],
    count1 = array1.length,
    count2 = array2.length;
    
array1.forEach(function (a) {
    if (array2.includes(a)) {
        count1--;
        count2--;
    }
});
console.log(count1, count2);

【讨论】:

  • 可读性比花哨的短代码更重要。你总有办法让新手程序员完全无法理解最简单的逻辑。
  • 特别是&& (count1--, count2--) 是新用户无法识别的东西。 && 作为快捷方式 if( , ) 不是它们能够识别的常见结构。
  • @NinaScholz 我知道你多么想使用reduce,并编写更多晦涩的代码。给你:const common = arr.reduce((result, elt) => result + array2.includes(elt));。请注意我们添加布尔值的巧妙方式。现在答案只是array1.length - commonarray2.length - common
  • @torazaburo,你知道(我希望如此),我可以用 reduce 风格写,但在这种情况下没有必要(为了保存一行代码)。跨度>
【解决方案2】:

套装在这里会做得很好:)

let set1 = new Set(this.originalSelectedRows)
let set2 = new Set(this.selectedRows)
let difference = new Set([...set1].filter(n => !set2.has(n)))

它们也相对较快,但不如特制解决方案快:P

我假设你所有的物品都是独一无二的 :)

【讨论】:

  • 我喜欢你的表情——它们是否意味着我错过了某种笑话? :-)
  • 我真的需要放松笑容!该死!
【解决方案3】:

我会将一个数组转换为一个集合,然后过滤另一个数组以查找不在集合中的项目。

const
  valuesA = [1,2,3,4,5],
  valuesB = [3,4,5,6,7,8];
  
function getUniqueValues(sourceArray, testArray) {
  const 
    set = new Set(testArray);
    
  return sourceArray.filter(value => !set.has(value));
}

console.log(`Values in A and not in B: ${getUniqueValues(valuesA, valuesB)}`);
console.log(`Values in B and not in A: ${getUniqueValues(valuesB, valuesA)}`);

【讨论】:

    【解决方案4】:

    您可以使用Array#includes 函数来检查元素是否存在于第二个数组中

    const originalSelectedRows = [1,2,3,4,5];
    const selectedRows = [3,4,5,6,7,8];
    
    let isOnListCount = 0;
    let isNotOnListCount = 0;
    
    selectedRows.forEach(row => 
     originalSelectedRows.includes(row) ? isOnListCount++ : isNotOnListCount++
    );
    
    console.log(isOnListCount);
    console.log(isNotOnListCount);

    【讨论】:

    • @Alex 您接受的答案与您自己所说的正确答案不同,第一种情况是2
    • 你是对的。我要删除这个答案。我没有注意到我的结果是错误的。删除接受,让我删除这个
    • 你为什么不直接修复答案,而不是删除它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 2018-08-01
    • 2011-12-13
    相关资源
    最近更新 更多