Javascript - удалить элемент массива при условии

Мне было интересно, как я буду реализовывать метод в javascript, который удаляет все элементы массива, которые устраняют определенное условие. (Желательно без использования jQuery)

Исх.

ar = [ 1, 2, 3, 4 ];
ar.removeIf( function(item, idx) {
    return item > 3;
});

Вышеупомянутый будет проходить через каждый элемент массива и удалять все те, что return true для условия (в примере, элемент > 3).

Я только начинаю работать в javascript и задаюсь вопросом, знает ли кто-нибудь о коротком эффективном способе сделать это.

- Обновление -

Было бы здорово, если бы условие могло работать и с объектными свойствами.

Исх.

ar = [ {num:1, str:"a"}, {num:2, str:"b"}, {num:3, str:"c"} ];
ar.removeIf( function(item, idx) {
    return item.str == "c";
});

Если элемент будет удален, если item.str == "c"

- Update2 -

Было бы неплохо, если бы условия индекса могли работать.

Исх.

ar = [ {num:1, str:"a"}, {num:2, str:"b"}, {num:3, str:"c"} ];
ar.removeIf( function(item, idx) {
    return idx == 2;
});

Ответы

Ответ 1

Вы можете добавить свой собственный метод к Array, который сделает что-то подобное, если filter не работает для вас.

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

Для меня это одна из самых классных функций JavaScript. Ян указал на более эффективный способ сделать то же самое. Учитывая, что это JavaScript, каждый бит помогает:

Array.prototype.removeIf = function(callback) {
    var i = this.length;
    while (i--) {
        if (callback(this[i], i)) {
            this.splice(i, 1);
        }
    }
};

Это позволяет избежать необходимости даже беспокоиться об обновлении length или перехватывать следующий элемент, поскольку вы работаете на своем пути слева, а не справа.

Ответ 2

Вы можете использовать метод фильтра массивов.

Код будет выглядеть так:

ar = [ 1, 2, 3, 4 ];
ar = ar.filter( function(item) {
    return !(item > 3);
});

Ответ 3

Вы можете использовать Array.filter(), что делает обратное:

ar.filter(function(item, idx) {
    return item <= 3;
});

Ответ 4

просто напишите следующий пример, если условие может работать и с объектными свойствами

var ar = [ {num:1, str:"a"}, {num:2, str:"b"}, {num:3, str:"c"} ];
var newArray = [];
for (var i = 0, len = ar.length; i<len; i++) {
        if (ar[i].str == "b") 
        {newArray.push(ar[i]);};
 };
console.log(newArray);

См. пример Живой пример

Ответ 5

Мне нравятся такие вопросы и другая версия от меня тоже...:)

Array.prototype.removeIf = function(expression) {
   var res = [];
    for(var idx=0; idx<this.length; idx++)
    {
      var currentItem = this[idx];
        if(!expression(currentItem))
        {
            res.push(currentItem);
        }
    }
    return res;
}

ar = [ 1, 2, 3, 4 ];
var result = ar.removeIf(expCallBack);


console.log(result);
function expCallBack(item)
{
    return item > 3;
}

Ответ 6

Вы можете использовать lodash.remove

var array = [1, 2, 3, 4];
var evens = _.remove(array, function(n) {
  return n % 2 == 0;
});

console.log(array);
// => [1, 3]

console.log(evens);
// => [2, 4]