Question Comment supprimer un élément de tableau par valeur?


Existe-t-il une méthode pour supprimer un élément d'un tableau JavaScript?

Étant donné un tableau:

var ary = ['three', 'seven', 'eleven'];

Je voudrais faire quelque chose comme:

removeItem('seven', ary);

J'ai regardé dans splice() mais cela ne disparaît que par le numéro de position, alors que j'ai besoin de quelque chose pour supprimer un élément par sa valeur.


637
2017-10-17 17:43


origine


Réponses:


Cela peut être une fonction globale ou une méthode d'un objet personnalisé, si vous n'êtes pas autorisé à ajouter des prototypes natifs. Il supprime tous les éléments du tableau correspondant à l'un des arguments.

Array.prototype.remove = function() {
    var what, a = arguments, L = a.length, ax;
    while (L && this.length) {
        what = a[--L];
        while ((ax = this.indexOf(what)) !== -1) {
            this.splice(ax, 1);
        }
    }
    return this;
};

var ary = ['three', 'seven', 'eleven'];

ary.remove('seven');

/*  returned value: (Array)
three,eleven
*/

Pour en faire un

function removeA(arr) {
    var what, a = arguments, L = a.length, ax;
    while (L > 1 && arr.length) {
        what = a[--L];
        while ((ax= arr.indexOf(what)) !== -1) {
            arr.splice(ax, 1);
        }
    }
    return arr;
}
var ary = ['three', 'seven', 'eleven'];
removeA(ary, 'seven');


/*  returned value: (Array)
three,eleven
*/

Et pour prendre soin de IE8 et ci-dessous

if(!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(what, i) {
        i = i || 0;
        var L = this.length;
        while (i < L) {
            if(this[i] === what) return i;
            ++i;
        }
        return -1;
    };
}

386
2017-10-17 20:16



Vous pouvez utiliser le indexOf méthode comme ça:

var index = array.indexOf(item);
if (index !== -1) array.splice(index, 1);

Remarque: Vous aurez besoin de le caler pour IE8 et ci-dessous

var array = [1,2,3,4]
var item = 3

var index = array.indexOf(item);
if (index !== -1) array.splice(index, 1);

console.log(array)


1159
2017-10-17 17:45



Un one-liner le fera,

var ary = ['three', 'seven', 'eleven'];

// Remove item 'seven' from array
var filteredAry = ary.filter(function(e) { return e !== 'seven' })
//=> ["three", "eleven"]

// In ECMA6 (arrow function syntax):
var filteredAry = ary.filter(e => e !== 'seven')

Cela fait usage de la filtre fonction dans JS. Il est pris en charge dans IE9 et plus.

Qu'est-ce qu'il fait (à partir du lien doc)

filter () appelle une fonction de rappel fournie une fois pour chaque élément d'un tableau et construit un nouveau tableau de toutes les valeurs pour lesquelles le callback renvoie une valeur qui se contraint à true. le rappel est appelé uniquement pour les index du tableau auquel des valeurs ont été affectées; il n'est pas appelé pour les index qui ont été supprimés ou pour lesquels aucune valeur n'a été affectée. Les éléments de tableau qui ne réussissent pas le test de rappel sont simplement ignorés et ne sont pas inclus dans le nouveau tableau.

Donc, fondamentalement, c'est la même chose que tous les autres for (var key in ary) { ... } solutions, sauf que for in La construction est supportée à partir de IE6.

Fondamentalement, le filtre est une méthode de commodité qui semble beaucoup plus agréable (et est chainable) par opposition à la for in construire (AFAIK).


248
2017-12-29 16:05



Vous pouvez utiliser underscore.js. Cela rend vraiment les choses simples.

Par exemple, avec ceci:

var result = _.without(['three','seven','eleven'], 'seven');

Et result sera ['three','eleven'].

Dans votre cas, le code que vous devrez écrire est:

ary = _.without(ary, 'seven')

Cela réduit le code que vous écrivez.


121
2018-02-19 09:52



Découvrez de cette façon:

for(var i in array){
    if(array[i]=='seven'){
        array.splice(i,1);
        break;
    }
}

et dans une fonction:

function removeItem(array, item){
    for(var i in array){
        if(array[i]==item){
            array.splice(i,1);
            break;
        }
    }
}

removeItem(array, 'seven');

44
2017-07-17 17:31



Voici une version qui utilise jQuery Fonction inArray:

var index = $.inArray(item, array);
if (index != -1) {
    array.splice(index, 1);
}

34
2017-07-12 09:02



var index = array.indexOf('item');

if(index!=-1){

   array.splice(index, 1);
}

25
2017-11-13 13:49



Ce que vous recherchez est le filtre

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

Cela vous permettra de faire ce qui suit:

var ary = ['three', 'seven', 'eleven'];
var aryWithoutSeven = ary.filter(function(value) { return value != 'seven' });
console.log(aryWithoutSeven); // returns ['three', 'eleven']

Cela a également été noté dans ce fil ailleurs: https://stackoverflow.com/a/20827100/293492


14
2017-08-24 02:15



Vous pouvez le faire avec ces deux moyens:

var arr = ["1","2","3","4"] // we wanna delete number "3"

premier:

arr.indexOf('3') !== -1 && arr.splice(arr.indexOf('3'), 1)

deuxième (ES6):

arr = arr.filter(e => e !== '3')

12
2017-12-26 15:40



Vu qu'il n'y en a pas de jolie, voici une fonction ES6 simple et réutilisable.

const removeArrayItem = (arr, itemToRemove) => {
  return arr.filter(item => item !== itemToRemove)
}

Usage:

const items = ['orange', 'purple', 'orange', 'brown', 'red', 'orange']
removeArrayItem(items, 'orange')

9
2018-06-26 11:44



Supprimer tous les éléments correspondants du tableau (plutôt que le premier comme semble être la réponse la plus commune ici):

while ($.inArray(item, array) > -1) {
    array.splice( $.inArray(item, array), 1 );
}

J'ai utilisé jQuery pour soulever des objets lourds, mais vous avez l'idée si vous voulez devenir natif.


6
2018-01-22 17:04