优化ES6交叉的数组函数

时间:2017-10-13 13:02:07

标签: javascript ecmascript-6

我有以下阵列:

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

4 个答案:

答案 0 :(得分:2)

您可以将长度作为计数器,并使用常用项目减少该值。



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);




答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:1)

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

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)}`);

答案 3 :(得分:0)

您可以使用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);