2016-09-29 118 views
2

.splice()方法的基本問題,以及如何最好地從數組中刪除元素。從數組中刪除元素(拼接)

我想從.splice()中刪除數組中的項目,但是當我這樣做時,我想要原始數組減去返回的已刪除元素。代替.splice()返回刪除元素

var arr = [1, 2, 3, 4, 5, 6, 7] 
var newArr = arr.splice(3, 1) 

console.log(newArr) // [4] 

// whereas I want [1, 2, 3, 5, 6, 7] 

什麼是最好的,最雄辯的方式來做到這一點?

+0

如果你記錄了'arr',你會發現元素已經被刪除。他們已被返回並通過拼接功能分配給'newArr'。 – gelliott181

回答

3

.splice將數組置換並返回已移除的元素。所以,除非你確實需要返回數組本身的功能,只需訪問arr

var arr = [1, 2, 3, 4, 5, 6, 7] 
arr.splice(3, 1) 
console.log(arr) // [1, 2, 3, 5, 6, 7] 

您可以創建執行拼接並返回數組的包裝功能:

function remove(arr, index) { 
    arr.splice(index, 1) 
    return arr; 
} 

var newArr = remove(arr, 3); 
// Note: `newArr` is not a new array, it has the same value as `arr` 

如果你想創建一個新的數組,而不改變原來的陣列Y,你可以使用.filter

var newArr = arr.filter(function(element, index) { 
    return index !== 3; 
}); // [1, 2, 3, 5, 6, 7] 
arr; // [1, 2, 3, 4, 5, 6, 7] 
+0

'arr'更新'array'吧?爲什麼不使用它? – Rayon

+0

@Rayon:詢問OP;)但是,也許他們不知道這件事,讓我澄清一下。 –

+0

我認爲這是第一個建議..如果他問,他確實/可能不知道它是如何... – Rayon

4

採用擴頻操作,你可以這樣做:

var arr = [1,2,3,4,5,6], 
    indexToRemove = 3, 
    newArr = [ 
     ...arr.slice(0,indexToRemove), 
     ...arr.slice(indexToRemove+1) 
    ] 

或者,如果你想使用ES5,它可以是這個樣子:

var arr = [1,2,3,4,5,6], 
    indexToRemove = 3, 
    newArr = [].concat(arr.slice(0,indexToRemove)).concat(arr.slice(indexToRemove+1)) 
+1

可以稱之爲*傳播元素*,而不是傳播*運營商*。即使MDN這樣說,它也不是運營商。 –

+0

以前見過這種方法。這種情況有點冗長,但我同意在其他可能更復雜的情況下可能會有用。 – Paulos3000

+1

你只要使用'.filter'就可以實現,這相當於少了代碼,並且不會產生不必要的中間數組:'newArr = arr.filter((_,i)=> i!== indexToRemove) ' –