Решая на первый взгляд простую задачу я столкнулся с некоторыми поблемами. Задача состоит в том, чтобы из массива удалить один из его элементов. Оказалось, что стандартными средствами 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'); 

Стоит отетить, что описанный выше способ не являтся оптимальным с точки зрения производительности, но на небольших массивах ето не является существенным.


Comments

Dmytro Shteflyuk Ukraine

Friday, July 10, 2009 1:08 PM

Dmytro Shteflyuk

Почему не использовать банальный
arr.splice(arr.indexOf('a'), 1);

e0ne Ukraine

Monday, January 18, 2010 3:32 PM

e0ne

Всегда догадывался, что это был очередной велосипед. Microsoft Ajax Library: Array type extensions - метод Arrya.remove(array, item) даёт нужную функциональность.

Riim Russia

Wednesday, January 20, 2010 4:53 AM

Riim

>>> метод Arrya.remove(array, item) даёт нужную функциональность

и делает все правильно, а именно не создает нового экземпляра массива:
var arr = [0, 1, 2];
alert(arr.removeByValue(1) == arr);// false, а должно быть true

Кроме того предлагаемый здесь вариант имеет довольно низкую производительность.

Если специально нужно создавать новый экземпляр, то в качестве имени метода лучше подойдет "without": http://realcode.ru/Item.aspx?id=810d99a55243d04d

a22432 Russia

Saturday, April 2, 2011 9:13 PM

a22432

Ваш урок вовремя выручил, спасибо!

Comments are closed