Saubere Möglichkeit, Elemente aus Javascript-Arrays zu entfernen(mit jQuery, coffeescript)




javascript array push (7)

Es gibt viele Fragen dazu, nicht zuletzt: jQuery Version von Array enthält , eine Lösung mit der Spleiß-Methode und vieles mehr. Sie erscheinen jedoch alle kompliziert und ärgerlich.

Mit den kombinierten Befugnissen von Javascript, jQuery und coffeescript, was ist der sauberste Weg, um ein Element aus einem Javascript-Array zu entfernen? Wir kennen den Index nicht im Voraus. In Code:

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

Wenn eine gute eingebaute Methode fehlschlägt, was ist eine saubere Art, Javascript-Arrays zu erweitern, um solch eine Methode zu unterstützen? Wenn es hilft, verwende ich Arrays als Sets. Lösungen werden idealerweise gut in coffeescript mit jQuery-Unterstützung funktionieren. Außerdem ist mir die Geschwindigkeit nicht egal, aber ich bevorzuge klaren, einfachen Code.


Answer #1

Das ist mit jQuery wirklich einfach:

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

Anmerkungen:

splice gibt die Elemente zurück, die entfernt wurden, also myArray = myArray.splice() . myArray.splice(index,1) bedeutet "entferne das Array-Element am Index 'index' vom Array".

$.inArray gibt den Index im Array des $.inArray zurück oder -1, wenn der Wert nicht im Array ist.


Answer #2

KaffeeScript:

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

Das spleißt einfach das Element an der Position t , dem Index, an dem e gefunden wurde (wenn tatsächlich t > -1 ). Coffeescript übersetzt dies zu:

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

Und wenn Sie alle übereinstimmenden Elemente entfernen und ein neues Array mit CoffeeScript und jQuery zurückgeben möchten:

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

was übersetzt in:

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

Oder dasselbe ohne jQuerys grep tun:

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

was übersetzt zu:

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

Answer #3

Dies ist nur eine kleine Änderung zu Amirs genialer Lösung :

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

Das gibt das Element zurück, wenn die Liste es enthält. So können Sie Folgendes tun:

do_something 100 if a.remove(100)

Das remove coffee Skript übersetzt in dieses Javascript:

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

Answer #4

Mit Vanille Javascript:

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

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

Answer #5

Wenn Sie auch die Bibliothek "userscore.js" von CoffeeScript verwenden, ist hier ein One-Liner, der gut funktioniert:

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

oder in js:

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

Answer #6

Sie könnten einfach das grep-Dienstprogramm von jQuery ausprobieren:

a = [4,8,2,3]
$.grep(a,function(v){return v!=8;})

Möglicherweise liegt hier ein Leistungsproblem vor, da Sie die Variable technisch veranlassen, auf ein neues Array zu verweisen. Du veränderst das Original nicht wirklich. Unter der Annahme, dass das Original nicht irgendwo anders referenziert wird, sollte der Garbage Collector dies ziemlich schnell übernehmen. Das war nie ein Problem für mich, aber andere wissen es vielleicht besser. Prost!


Answer #7

Das scheint ziemlich sauber und verständlich zu sein; Im Gegensatz zu anderen Antworten berücksichtigt es die Möglichkeit, dass ein Element mehr als einmal angezeigt wird.

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

In CoffeeScript:

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




coffeescript