2015-09-01 74 views
0

所以,我試圖匹配2個不同的數組。如果相同的單元格匹配,我想使用.slice方法從一個數組中移除該單元格。當它匹配另一個陣列時清空數組

編輯:我想要做的是從array1中刪除一個數字,如果array2包含匹配的數字。代碼現在的工作方式是隻刪除1個條目。我想從第一個數組中刪除所有條目。

array1 = [1, 2, 4, 5, 7, 10]; 
array2 = [1,2,4,5,6,7,8]; 

var misc = function deleteValues(array, arayy) { 
    for(var i = 0; i < array.length; i++) { 
    if (arayy[i] == array[i]) { 
     array.splice(i, 1); 
    } 
    } 
    return array; 
}; 

我嘗試運行此操作並在控制檯日誌下,array1未更改。看起來splice方法並沒有去除任何細胞。我搜查了SE,但找不到任何可以幫助我的東西。

+1

你是如何實際運行'雜項()'? –

+0

調用'misc'後'array1'的預期結果是什麼? – guest271314

+0

您是否嘗試過使用調試器,還是僅僅讓其他人這樣做? – Amit

回答

3

jsFiddle Demo

的問題是,要修改的陣列中的一個作爲你迭代,但是你仍然使用相同的索引。最終的結果是,您最終會在第一次移除後比較錯誤的索引。使用兩個索引,當刪除一個項目時使一個偏移向下,並讓另一個偏移迭代。

var misc = function deleteValues(array, arayy) { 
    for(var i = 0, j = 0; i < array.length; i++, j++) { 
     if (arayy[j] == array[i]) { 
      array.splice(i--, 1); 
     } 
    } 
    return array; 
}; 
+0

感謝您的回答。工作得很好。一個問題:在這裏使用「我 - 」的邏輯是什麼? –

+0

感謝您的回答。工作得很好。一個問題:在這裏使用「我 - 」的邏輯是什麼?這讓我感到困惑,因爲我們不等於-1,因爲我們的索引是0? –

+0

這是你想要的,因爲這樣做你似乎在問什麼,過濾到7和10,通過檢查索引匹配,但在其他地方,你暗示你想過濾array1中的所有值,只剩下10個 –

1

看來你想從第一個數組中刪除項目,如果值也在第二個。 reduceRight方法似乎比較合適,因爲它在數組上從右向左迭代,因此刪除項目不會影響數組中後續元素的索引。減量循環可以達到相同的結果。

此外,我認爲函數聲明比賦值表達式更好,但每個函數聲明都是自己的。

var array1 = [1, 2, 4, 5, 7, 10]; 
 
var array2 = [1,2,4,5,6,7,8]; 
 

 
function deleteValues(arr0, arr1) { 
 
    arr0.reduceRight(function(x, value, index) { 
 
    if (arr1.indexOf(value) != -1) { 
 
     arr0.splice(index, 1); 
 
    } 
 
    },''); 
 

 
    // Not necessary but handy for chaining 
 
    return arr0; 
 
} 
 

 
document.write(deleteValues(array1, array2));

使用箭頭功能,上面可以簡化爲:

function deleteValues(arr0, arr1) { 
    arr0.reduceRight((x, v, i) => arr1.indexOf(v) != -1? arr0.splice(i, 1):''); 
    return arr0; 
} 
相關問題