2017-10-13 113 views
0

我有以下陣列:優化陣列功能ES6路口

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

但我想知道這是否可以在一個整潔時尚USNG一些ES6的新功能來實現,或者原有的JS

+0

你可以假設它們在一般的排序? – user2662833

+1

您正在尋找兩個陣列之間的**差異**。谷歌爲此。 – 2017-10-13 13:09:28

+0

請參閱https://stackoverflow.com/questions/40998880/get-the-different-of-arrays-in-es6 –

回答

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

+0

@Alex你已經接受了一個答案,答案與你自己所說的正確答案不同,這是第一種情況下的「2」。 – 2017-10-13 16:45:59

+0

你說得對。我要刪除這個答案。我沒有注意到我的結果是錯誤的。刪除接受,讓我刪除這個 –

+0

爲什麼你不修正答案,而不是刪除它? –

1

集將在這裏做的非常出色:)

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

他們也比較快速,但不如特製解決方案那樣快:P

我假設所有的項目是獨一無二的,但:) :)

+0

我愛你的表情符號 - 他們的意思是在那裏有一種我錯過的笑話? :-) – 2017-10-13 13:12:00

+0

我真的需要緩和笑容!黨! – user2662833

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

+0

可讀性比短小的代碼更重要。你總是有辦法讓新程序員完全理解最簡單的邏輯。 – Cerbrus

+0

具體而言'&&(count1--,count2 - )'是新用戶無法識別的內容。 '&&'作爲快捷方式'if'和'(,)'不是他們將識別的常見結構。 – Cerbrus

+0

@NinaScholz我知道你有多想使用'reduce',並寫出更多不明確的代碼。在這裏你去:'const common = arr.reduce((result,elt)=> result + array2.includes(elt));'。請注意我們添加布爾值的巧妙方法。現在答案只是'array1.length - common'和'array2.length - common'。 – 2017-10-13 17:09:27

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