清除从javascript数组中删除元素的方法(使用jQuery,coffeescript)

Pet*_*ter 59 javascript jquery coffeescript

关于这一点有很多问题,尤其是: 数组的jQuery版本包含,splice方法的解决方案等等.然而,它们看起来既复杂又令人讨厌.

利用javascript,jQuery和coffeescript的强大功能,从javascript数组中删除元素的最简洁方法是什么?我们事先并不知道该指数.在代码中:

a = [4,8,2,3]
a.remove(8)     # a is now [4,2,3]
Run Code Online (Sandbox Code Playgroud)

如果没有一个好的内置方法,那么扩展javascript数组以支持这种方法的干净方法是什么?如果它有帮助,我真的使用数组作为集合.解决方案理想情况下可以在coffeescript中使用jQuery支持.此外,我不关心速度,而是优先考虑清晰,简单的代码.

Ami*_*mir 87

CoffeeScript的:

Array::remove = (e) -> @[t..t] = [] if (t = @indexOf(e)) > -1
Run Code Online (Sandbox Code Playgroud)

这简单地拼接了位置上的元素,找到t了索引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);
    }
};
Run Code Online (Sandbox Code Playgroud)

如果你想删除所有匹配的元素,并返回一个新的数组,使用CoffeeScript和jQuery:

Array::remove = (v) -> $.grep @,(e)->e!=v
Run Code Online (Sandbox Code Playgroud)

这意味着:

Array.prototype.remove = function(v) {
    return $.grep(this, function(e) {
        return e !== v;
    });
};
Run Code Online (Sandbox Code Playgroud)

或者在没有jQuery的grep的情况下做同样的事情:

Array::filterOutValue = (v) -> x for x in @ when x!=v
Run Code Online (Sandbox Code Playgroud)

转换为:

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;
};
Run Code Online (Sandbox Code Playgroud)

  • 很明显,你使用CoffeeScript的时间比我长得多; +1看似非常惯用. (5认同)
  • 多亏了这个`$ .grep @,(e) - > e!= v`,我再也不会想到使用CoffeeScript了.可读性等于零. (4认同)
  • 该死的coffeescript是美丽的.我相信你可以摆脱@ .indexOf而只是做@indexOf(没有点). (2认同)

jAn*_*ndy 27

使用vanilla 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);
Run Code Online (Sandbox Code Playgroud)

只有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);
Run Code Online (Sandbox Code Playgroud)


ada*_*vea 14

使用jQuery非常简单:

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

笔记:

splice返回已删除的元素,所以不要这样做myArray = myArray.splice(). myArray.splice(index,1)表示"从数组中删除索引'index'处的数组元素".

$.inArray 返回您要查找的值的数组中的索引,如果该值不在数组中,则返回-1.

  • 问题是:"从javascript数组中删除**元素的最简洁方法是什么?" (2认同)

Dom*_*nic 9

这看起来很干净,也很容易理解; 与其他答案不同,它考虑了元素不止一次出现的可能性.

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

在CoffeeScript中:

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