59 votes

Méthode propre pour supprimer un élément d'un tableau javascript (avec jQuery, coffeescript)

De nombreuses questions se posent à ce sujet, notamment : La version jQuery du tableau contient , une solution avec la méthode de l'épissure et bien d'autres encore. Cependant, ils semblent tous compliqués et ennuyeux.

Avec les pouvoirs combinés de javascript, jQuery et coffeescript, quel est le moyen le plus propre de supprimer un élément d'un tableau javascript ? Nous ne connaissons pas l'index à l'avance. En code :

a = [4,8,2,3]
a.remove(8)     # a is now [4,2,3]

En l'absence d'une bonne méthode intégrée, quelle est la manière propre d'étendre les tableaux de javascript pour supporter une telle méthode ? Si cela peut aider, j'utilise vraiment les tableaux comme des ensembles. Les solutions fonctionneront idéalement dans coffeescript avec le support de jQuery. En outre, je ne me soucie pas de la vitesse, mais plutôt d'un code clair et simple.

88voto

Amir Points 3237

CoffeeScript :

Array::remove = (e) -> @[t..t] = [] if (t = @indexOf(e)) > -1

Ce qui permet simplement de couper l'élément à la position t l'indice où e a été trouvé (s'il a effectivement été trouvé t > -1 ). Coffeescript traduit cela par :

Array.prototype.remove = function(e) {
    var t, _ref;
    if ((t = this.indexOf(e)) > -1) {
        return ([].splice.apply(this, [t, t - t + 1].concat(_ref = [])), _ref);
    }
};

Et si vous voulez supprimer tous les éléments correspondants, et renvoyer un nouveau tableau, en utilisant CoffeeScript et jQuery :

Array::remove = (v) -> $.grep @,(e)->e!=v

ce qui se traduit par :

Array.prototype.remove = function(v) {
    return $.grep(this, function(e) {
        return e !== v;
    });
};

Ou faire la même chose sans le grep de jQuery :

Array::filterOutValue = (v) -> x for x in @ when x!=v

ce qui se traduit par :

Array.prototype.filterOutValue = function(v) {
    var x, _i, _len, _results;
    _results = [];
    for (_i = 0, _len = this.length; _i < _len; _i++) {
        x = this[_i];
        if (x !== v) {
            _results.push(x);
        }
    }
    return _results;
};

28voto

jAndy Points 93076

En utilisant du Javascript vanille :

Array.prototype.remove = function(elem) {
    var match = -1;

    while( (match = this.indexOf(elem)) > -1 ) {
        this.splice(match, 1);
    }
};

var a = [4, 8, 2, 3];

a.remove(8);

Seulement jQuery :

jQuery.removeFromArray = function(value, arr) {
    return jQuery.grep(arr, function(elem, index) {
        return elem !== value;
    });
};

var a = [4, 8, 2, 3];

a = jQuery.removeFromArray(8, a);

14voto

adavea Points 551

C'est très facile avec jQuery :

var index = $.inArray("value", myArray);
if(index != -1)
{
  myArray.splice(index, 1);
}

Notas:

splice renvoie les éléments qui ont été supprimés, donc ne faites pas de myArray = myArray.splice() . myArray.splice(index,1) signifie "supprimer l'élément du tableau à l'index 'index' du tableau".

$.inArray renvoie l'index dans le tableau de la valeur que vous recherchez, ou -1 si la valeur n'est pas dans le tableau.

9voto

Domenic Points 40761

Cela semble assez propre et compréhensible ; contrairement aux autres réponses, elle tient compte de la possibilité qu'un élément apparaisse plus d'une fois.

Array.prototype.remove = function (value) {
    for (var i = 0; i < this.length; ) {
        if (this[i] === value) {
            this.splice(i, 1);
        } else {
           ++i;
        }
    }
}

Dans CoffeeScript :

Array::remove = (value) ->
    i = 0
    while i < @length
        if @[i] == value
            @splice i, 1
        else
            ++i
    return @

4voto

georgedyer Points 1062

Si vous utilisez également l'outil de création CoffeeScript underscore.js bibliothèque, voici une phrase qui fera l'affaire :

a = _(a).reject (v)-> v is e

ou en js :

a = _(a).reject(function(v) { return v == e; });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X