2016-09-29 121 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) ' –