Решая на первый взгляд простую задачу я столкнулся с некоторыми поблемами. Задача состоит в том, чтобы из массива удалить один из его элементов. Оказалось, что стандартными средствами JavaScript этого не сделать.
Итак, у нас есть исходный массив:
var arr = new Array();
arr.push('q');
arr.push('w');
arr.push('a');
arr.push('e');
arr.push('r');
arr.push('t');
arr.push('z');
arr.push('y');
Задача состоит в том, чтобы удалить из него элементы со значениями "a" и "z". Первой же идеей было использование оператора delete:
var i = arr.indexOf('a');
delete arr[i];
i = arr.indexOf('z');
delete arr[i];
И было вы всё хорошо, еслиб не реализация этого самого оператора delete: элементы из массива на самом не удаляются, просто их значение стоновится undefined и, соответственно, свойство lenght не меняется. Можно, конечно, при обходе массива проверять значение элементов и таким образом проверять, удалённый он или нет, но в моём случае это несло за собой изменение логики на сервере, что делать не хотелось и было принято решение реализовать нужную функциональность в классе Array:
Array.prototype.removeByValue = function(item){
var itemIndex = -1;
for (var index = 0; index < this.length; index++)
{
if (this[index] == item){
itemIndex=index;
}
}
if (itemIndex == -1){
return this;
}
var resultLeft = this.slice(0, itemIndex);
var resultRight = this.slice(itemIndex+1, this.length);
var resultTotal = resultLeft.concat(resultRight);
return resultTotal;
};
Способ использования:
var a = arr.removeByValue('a');
arr = a.removeByValue('z');
Стоит отетить, что описанный выше способ не являтся оптимальным с точки зрения производительности, но на небольших массивах ето не является существенным.