59

これについては多くの質問がありますが、特に: 配列の jQuery バージョンには、 splice メソッドを使用したソリューションなどが含まれてます。ただし、それらはすべて複雑で煩わしいようです。

javascript、jQuery、coffeescript の力を組み合わせて、javascript 配列から要素を削除する最もクリーンな方法は何ですか? インデックスは事前にわかりません。コード内:

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

適切な組み込みメソッドに失敗した場合、そのようなメソッドをサポートするために JavaScript 配列を拡張するクリーンな方法は何ですか? それが役立つ場合、私は実際に配列をセットとして使用しています。ソリューションは、jQuery をサポートする coffeescript でうまく機能するのが理想的です。また、速度は気にせず、明確でシンプルなコードを優先しました。

4

8 に答える 8

88

コーヒースクリプト:

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

tこれは、 position 、見つかったインデックスe(実際に見つかった場合)の要素を単純につなぎ合わせt > -1ます。Coffeescript はこれを次のように変換します。

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

また、CoffeeScript と jQuery を使用して、一致するすべての要素を削除し、新しい配列を返したい場合:

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

これは次のように変換されます。

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

または、jQuery の grep を使用せずに同じことを行います。

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

これは次のように変換されます。

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;
};
于 2011-01-28T08:18:37.177 に答える
28

バニラ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);

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);
于 2011-01-28T07:28:26.473 に答える
14

これは、jQuery を使用すると非常に簡単です。

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

ノート:

splice削除された要素を返すので、しないでくださいmyArray = myArray.splice()myArray.splice(index,1)「配列からインデックスの配列要素を削除する」ことを意味します'index'

$.inArray探している値の配列内のインデックスを返します。値が配列内にない場合は -1 を返します。

于 2012-05-24T18:24:04.990 に答える
9

これはかなりきれいでわかりやすいようです。他の回答とは異なり、要素が複数回表示される可能性が考慮されます。

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

CoffeeScript では:

Array::remove = (value) ->
    i = 0
    while i < @length
        if @[i] == value
            @splice i, 1
        else
            ++i
    return @
于 2011-01-28T07:37:29.317 に答える
4

CoffeeScript 作成者のunderscore.jsライブラリも使用している場合は、うまく機能するワンライナーを次に示します。

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

またはjsで:

a = _(a).reject(function(v) { return v == e; });
于 2012-02-08T22:50:41.457 に答える
3

これは、 Amir のすばらしいソリューションを少し変更しただけです。

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

リストに要素がある場合に要素を返すため、次のようなことができます。

do_something 100 if a.remove(100)

remove coffee スクリプトは、次の 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);
  }};
于 2011-11-12T13:15:41.863 に答える
1

jQuery の grep ユーティリティを試してみてください。

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

技術的に変数が新しい配列を参照するようにしているため、ここでパフォーマンスの問題が発生する可能性があります。元のものを実際に変更しているわけではありません。オリジナルが他の場所で参照されていないと仮定すると、ガベージ コレクターは or これをかなり迅速に取得する必要があります。これは私にとっては決して問題ではありませんでしたが、他の人はもっとよく知っているかもしれません. 乾杯!

于 2012-07-05T23:30:53.343 に答える