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]