2015-09-08 141 views
0

我有一個JS數組的問題。整數數組比較

實施例:

var fullArr = [1,2,3,4]; 
var partArr = [2,3]; 
var newArr = []; 

我們有一個主陣列fullArr和部分陣列partarr。我想創建一個函數/過濾器,它正在尋找fullArr中的現有項目,而不是在partArr中。 在上面的示例中,newArr必須等於[1,4]。

我試過做這樣的事情,但它不能正常工作。

for (var k in fullArray) { // [1,2,3,4] 
    for (var j in selectedArray) { // [1,4] 
    if (fullArray[k] == selectedArray[j]) { 
     newArray.splice(selectedArray[j] - 1, 1); // must be [2,3] 
     break; 
    } 
    } 
} 

這是什麼做法的好方法?謝謝。

+0

'但它工作不正常「它怎麼不工作?它給你什麼結果? –

+0

附註:它可能與你的代碼無關,但一般來說,對數組使用'for ... in'是一個壞主意,因爲順序不能保證。使用常規的'for'循環。 –

+0

使用'Array。filter'是更簡單的解決方案,但您可能還想查看[Array.splice]的文檔(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/拼接),因爲你沒有正確使用它。但是由於你(大概)試圖向'newArr'添加一個項目,使用'push'會更容易。 –

回答

5

這裏有一個

var newArr = fullArr.filter(function(f) { // The filter() method creates a new array with all elements that pass the test implemented by the provided function. 
    return partArr.indexOf(f) == -1; // The indexOf() method returns the first index at which a given element can be found in the array, or -1 if it is not present. 
}) 

打動女孩子,你也可以

var newArr = fullArr.filter(function(f) { 
    return !~partArr.indexOf(f); 
}) 
+0

有一點解釋可能會提高你的回答 –

+0

真的嗎? Array.filter和Array.indexOf應該是新手javascript程序員的麪包和黃油 –

+0

顯然他們不是OP。所以也許你可以幫助他們一點點?否則,你爲什麼打擾回答? –

2

這是給你的要求的代碼。

var fullArr = [1,2,3,4]; 
var partArr = [2,3]; 
var newArr = []; 

for(var i=0;i<fullArr.length;i++){ 
    if(partArr.indexOf(fullArr[i]) == -1) 
     newArr.push(fullArr[i]); 
}; 

這裏是工作Link

希望工程:)

1

可以使用filter()功能陣列上的工作原理:

var newArr = fullArr.filter(function(val, i, arr) { 
    return partArr.indexOf(val) === -1; 
}); 

這將返回一個包含一個新的數組每個迭代的值將返回true

如果你需要做這一個對象在未來的好方法是首先將對象鍵轉換成數組,然後運行過濾器上:

Object.keys(myObj).function(val, i, arr) { 
    return partArr.indexOf(val) === -1; 
}); 
+0

謝謝爲了解釋! –

1

這裏有一些其他的方法:

var fullArr = [1,2,3,4]; 
var partArr = [2,3]; 
var newArr = []; 

1. 
fullArr.map(function(element){ 
    if(partArr.indexOf(element) === -1) newArr.push(element); 
}) 
console.log(newArr); 

2. 
for(i in fullArr){ 
    if(partArr.indexOf(fullArr[i]) === -1) newArr.push(fullArr[i]); 
} 
console.log(newArr); 

3. 
fullArr.forEach(function(element){ 
    if(partArr.indexOf(element) === -1) newArr.push(element); 
}) 

console.log(newArr); 
1

事實上,你想要一個數組之間的公共部分。顯然你可以選擇spliceindexOfO(n * m)甚至O(m * n^2)的表現。它是不是幾個要素

或者,你可以使用對象作爲哈希地圖,找到差異(在最壞的情況下)O(n + m log m)更大的任何數組顯然不理想:

var fullArr = [1,2,3,4]; 
var partArr = [2,3]; 
var temporaryObject = Object.create(null); 
partArr.forEach(el=>temporaryObject[el] = true); // temporaryObject after this operation is {"2": true, "3": true} 
var newArr = fullArr.filter(el=>temporaryObject[el]); 

在這個例子中,我已經使用ES6功能叫做「 arrow functions「。它轉換爲以下ES5代碼:

var partArr = [2, 3]; 
var temporaryObject = Object.create(null); 
partArr.forEach(function (el) { 
    temporaryObject[el] = true; 
}); // temporaryObject after this operation is {"2": true, "3": true} 
var newArr = fullArr.filter(function (el) { 
    return temporaryObject[el]; 
}); 
+0

看起來很酷。謝謝! –