Mazání prvků pole v JavaScriptu - delete vs splice
Jaký je rozdíl mezi použitím operátoru delete na prvek pole oproti použití metody Array.splice?
Například:
myArray = ['a', 'b', 'c', 'd'];
delete myArray[1];
// or
myArray.splice (1, 1);
Proč vůbec mít metodu splice, když můžu mazat prvky pole stejně jako u objektů?
Odpověď č. 1
delete odstraní vlastnost objektu, ale nepřeindexuje pole ani nepřepočítá jeho délku. To způsobuje, že to vypadá, jako by byla hodnota nedefinovaná:
> myArray = ['a', 'b', 'c', 'd']
["a", "b", "c", "d"]
> delete myArray[0]
true
> myArray[0]
undefined
Všimněte si, že ve skutečnosti není nastavena na hodnotu undefined, spíše je vlastnost z pole odstraněna, což způsobuje, že se zdá být undefined. Nástroje pro vývojáře v Chromu tuto odlišnost jasně ukazují tím, že při logování pole vypisují empty.
> myArray[0]
undefined
> myArray
[empty, "b", "c", "d"]
myArray.splice(start, deleteCount) skutečně odstraní prvek, přečísluje pole a změní jeho délku.
> myArray = ['a', 'b', 'c', 'd']
["a", "b", "c", "d"]
> myArray.splice(0, 2)
["a", "b"]
> myArray
["c", "d"]
Odpověď č. 2
Metoda Array.remove()
John Resig, tvůrce jQuery, vytvořil velmi užitečnou metodu Array.remove, kterou vždy používám ve svých projektech.
// Array Remove - By John Resig (MIT Licensed)
Array.prototype.remove = function(from, to) {
var rest = this.slice((to || from) + 1 || this.length);
this.length = from < 0 ? this.length + from : from;
return this.push.apply(this, rest);
};
a zde je několik příkladů, jak by to mohlo být použito:
// Remove the second item from the array
array.remove(1);
// Remove the second-to-last item from the array
array.remove(-2);
// Remove the second and third items from the array
array.remove(1,2);
// Remove the last and second-to-last items from the array
array.remove(-2,-1);
Johnova webová stránka
Odpověď č. 3
Protože delete pouze odstraní objekt z prvku v poli, délka pole se nezmění. Splice odstraní objekt a zkrátí pole.
Následující kód zobrazí „a“, „b“, „undefined“, „d“
myArray = ['a', 'b', 'c', 'd']; delete myArray[2];
for (var count = 0; count < myArray.length; count++) {
alert(myArray[count]);
}
Zatímco toto zobrazí „a“, „b“, „d“
myArray = ['a', 'b', 'c', 'd']; myArray.splice(2,1);
for (var count = 0; count < myArray.length; count++) {
alert(myArray[count]);
}
Odpověď č. 4
Narazil jsem na tuto otázku, když jsem se snažil pochopit, jak odstranit každé výskyt prvku z pole. Zde je srovnání splice a delete pro odstranění každého 'c' z pole items.
var items = ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'];
while (items.indexOf('c') !== -1) {
items.splice(items.indexOf('c'), 1);
}
console.log(items); // ["a", "b", "d", "a", "b", "d"]
items = ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'];
while (items.indexOf('c') !== -1) {
delete items[items.indexOf('c')];
}
console.log(items); // ["a", "b", undefined, "d", "a", "b", undefined, "d"]
Odpověď č. 5
Z Core JavaScript 1.5 Reference > Operátory > Speciální operátory > Operátor delete :
Když odstraníte prvek pole, délka pole není ovlivněna. Například pokud odstraníte a[3], a[4] je stále a[4] a a[3] je nedefinované. To platí i tehdy, když odstraníte poslední prvek pole (delete a[a.length-1]).
Odpověď č. 6
Jak bylo výše mnohokrát uvedeno, použití splice() se zdá být ideální. Dokumentace na Mozille:
Metoda
splice()mění obsah pole tím, že odstraňuje existující prvky a/nebo přidává nové prvky.var myFish = ['angel', 'clown', 'mandarin', 'sturgeon']; myFish.splice(2, 0, 'drum'); // myFish is ["angel", "clown", "drum", "mandarin", "sturgeon"] myFish.splice(2, 1); // myFish is ["angel", "clown", "mandarin", "sturgeon"]Syntax
array.splice(start) array.splice(start, deleteCount) array.splice(start, deleteCount, item1, item2, ...)
Parametry
start
Index, na kterém začít měnit pole. Pokud je větší než délka pole, skutečný počáteční index bude nastaven na délku pole. Pokud je záporný, začíná se tolik prvků od konce.
početSmazaných
Celé číslo určující počet starých prvků pole, které mají být odstraněny. Pokud je deleteCount 0, žádné prvky nejsou odstraněny. V takovém případě byste měli zadat alespoň jeden nový prvek. Pokud je deleteCount větší než počet prvků zbývajících v poli počínaje indexem start, budou odstraněny všechny prvky až do konce pole.
Pokud je deleteCount vynechán, bude deleteCount roven (arr.length - start).
položka1, položka2, ...
Prvky k přidání do pole, počínaje počátečním indexem. Pokud nezadáte žádné prvky, splice() pouze odstraní prvky z pole.
Návratová hodnota
Pole obsahující smazané prvky. Pokud je odstraněn pouze jeden prvek, vrátí se pole s jedním prvkem. Pokud nejsou odstraněny žádné prvky, vrátí se prázdné pole.
[...]
Odpověď č. 7
splice bude fungovat s číselnými indexy.
zatímco delete lze použít proti jiným typům indexů..
příklad :
delete myArray['text1'];
