Question Suppression d'éléments de tableau dans JavaScript - delete vs splice


Quelle est la différence entre utiliser la delete opérateur sur l'élément de tableau par opposition à l'aide la Array.splice méthode?

Par exemple:

myArray = ['a', 'b', 'c', 'd'];

delete myArray[1];
//  or
myArray.splice (1, 1);

Pourquoi même avoir la méthode d'épissage si je peux supprimer des éléments de tableau comme je peux avec des objets?


1173
2018-02-01 11:11


origine


Réponses:


delete va supprimer la propriété de l'objet, mais ne réindexera pas le tableau ou ne mettra pas à jour sa longueur. Cela fait apparaître comme si elle est indéfinie:

> myArray = ['a', 'b', 'c', 'd']
  ["a", "b", "c", "d"]
> delete myArray[0]
  true
> myArray[0]
  undefined

Notez qu'il n'est pas en fait mis à la valeur undefined, plutôt la propriété est retirée du tableau, ce qui en fait apparaître indéfini. Les outils de développement Chrome font clairement cette distinction en imprimant empty lors de la journalisation du tableau.

> myArray[0]
  undefined
> myArray
  [empty, "b", "c", "d"]

myArray.splice(start, deleteCount) En fait, supprime l'élément, réindexe le tableau et modifie sa longueur.

> myArray = ['a', 'b', 'c', 'd']
  ["a", "b", "c", "d"]
> myArray.splice(0, 2)
  ["a", "b"]
> myArray
  ["c", "d"]

1539
2018-02-01 11:16



Array.remove () Méthode

John Resig, créateur de jQuery a créé un très pratique Array.remove méthode que je l'utilise toujours dans mes projets.

// 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);
};

et voici quelques exemples de comment il pourrait être utilisé:

// 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);

Le site de John


321
2018-03-22 00:51



Étant donné que delete ne supprime que l'objet de l'élément dans le tableau, la longueur du tableau ne changera pas. Splice supprime l'objet et raccourcit le tableau.

Le code suivant affichera "a", "b", "undefined", "d"

myArray = ['a', 'b', 'c', 'd']; delete myArray[2];

for (var count = 0; count < myArray.length; count++) {
    alert(myArray[count]);
}

Alors que cela affichera "a", "b", "d"

myArray = ['a', 'b', 'c', 'd']; myArray.splice(2,1);

for (var count = 0; count < myArray.length; count++) {
    alert(myArray[count]);
}

95
2018-02-01 11:13



Je suis tombé sur cette question en essayant de comprendre comment supprimer chaque occurrence d'un élément d'un tableau. Voici une comparaison de splice et delete pour enlever tous les 'c' du items Array.

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"]
​

60
2018-05-09 13:25



De  Core JavaScript 1.5 Référence> Opérateurs> Opérateurs spéciaux> delete Opérateur :

Lorsque vous supprimez un élément de tableau, le   La longueur du tableau n'est pas affectée. Pour   Par exemple, si vous supprimez un [3], un [4] est   encore a [4] et a [3] est indéfini. Ce   détient même si vous supprimez le dernier   élément du tableau (supprimer   a [a.length-1]).


13
2018-02-01 11:16



splice travaillera avec des indices numériques.

tandis que delete peut être utilisé contre d'autres types d'indices.

Exemple:

delete myArray['text1'];

9
2018-01-11 07:52



Il est probablement aussi important de mentionner que splice ne fonctionne que sur les tableaux. (Les propriétés d'objet ne peuvent pas être invoquées pour suivre un ordre cohérent.)

Pour supprimer la paire clé-valeur d'un objet, delete est réellement ce que vous voulez:

delete myObj.propName;     // , or:
delete myObj["propName"];  // Equivalent.

9
2017-08-01 20:11



effacer agit comme une situation non réelle du monde, juste supprime l'élément, mais la longueur du tableau reste la même:

exemple du terminal de noeud:

> var arr = ["a","b","c","d"];
> delete arr[2]
true
> arr
[ 'a', 'b', , 'd', 'e' ]

Voici une fonction pour supprimer un élément d'un tableau par index, en utilisant tranche(), il prend l'arr comme premier argument, et l'index du membre que vous voulez supprimer comme deuxième argument. Comme vous pouvez le voir, il supprime le membre du tableau et réduit la longueur du tableau de 1

function(arr,arrIndex){
    return arr.slice(0,arrIndex).concat(arr.slice(arrIndex + 1));
}

Ce que la fonction ci-dessus fait est de prendre tous les membres à l'index, et tous les membres après l'index, et concatène ensemble, et renvoie le résultat.

Voici un exemple utilisant la fonction ci-dessus comme un module de noeud, voyant le terminal sera utile:

> var arr = ["a","b","c","d"]
> arr
[ 'a', 'b', 'c', 'd' ]
> arr.length
4 
> var arrayRemoveIndex = require("./lib/array_remove_index");
> var newArray = arrayRemoveIndex(arr,arr.indexOf('c'))
> newArray
[ 'a', 'b', 'd' ] // c ya later
> newArray.length
3

Notez que cela ne fonctionnera pas avec un tableau contenant des dupes, car indexOf ("c") obtiendra juste la première occurrence, et seulement épissera et supprimera le premier "c" qu'il trouve.


7
2017-07-20 02:20



Comme indiqué plusieurs fois ci-dessus, en utilisant splice() semble être un ajustement parfait. Documentation sur Mozilla:

le splice() méthode modifie le contenu d'un tableau en supprimant des éléments existants et / ou en ajoutant de nouveaux éléments.

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"]

Syntaxe

array.splice(start)
array.splice(start, deleteCount)
array.splice(start, deleteCount, item1, item2, ...)

Paramètres

début

Index auquel commencer le changement du tableau. Si elle est supérieure à la longueur du tableau, l'index de départ réel sera défini sur la longueur du tableau. Si négatif, commencera que beaucoup d'éléments de la fin.

deleteCount

Entier indiquant le nombre d'anciens éléments du tableau à supprimer. Si deleteCount est 0, aucun élément n'est supprimé. Dans ce cas, vous devez spécifier au moins un nouvel élément. Si deleteCount est supérieur au nombre d'éléments restant dans le tableau commençant au début, alors tous les éléments à la fin du tableau seront supprimés.

Si deleteCount est omis, deleteCount sera égal à (arr.length - start).

item1, item2, ...

Les éléments à ajouter au tableau, en commençant à l'index de départ. Si vous ne spécifiez aucun élément, splice() ne supprimera que les éléments du tableau.

Valeur de retour

Un tableau contenant les éléments supprimés. Si un seul élément est supprimé, un tableau d'un élément est renvoyé. Si aucun élément n'est supprimé, un tableau vide est renvoyé.

[...]


7
2018-01-08 10:43



supprimer Vs splice

lorsque vous supprimez un élément d'un tableau

var arr = [1,2,3,4]; delete arr[2]; console.log(arr)
//result
[1, 2, 3:, 4]

quand vous épisserez

var arr = [1,2,3,4]; arr.splice(1,1); console.log(arr)
//result
 [1, 3, 4]

en cas de effacer la l'élément est supprimé mais le l'index reste vide

alors qu'en cas de épissure l'élément est supprimé et le l'index des éléments de repos est réduit en conséquence


6
2017-08-06 10:42



vous pouvez utiliser quelque chose comme ça

var my_array = [1,2,3,4,5,6];
delete my_array[4];
console.log(my_array.filter(function(a){return typeof a !== 'undefined';}));

Devrait afficher [1, 2, 3, 4, 6]


5
2017-11-26 12:34