2013-06-25 4 views
1

Резига, создатель JQuery создал a very handy Array.remove метод, который я всегда использовать его в своих проектах:Удалить массив индексов из массива

// Array Remove - By John Resig (MIT Licensed) 
Array.prototype.remove = function(from, to) { 
    var rest = this.slice((to || from) + 1 || this.length); 
    this.length = from < 0 ? this.length + from : from; 
    return this.push.apply(this, rest); 
}; 

// Remove the second item from the array 
array.remove(1); 
// Remove the second-to-last item from the array 
array.remove(-2); 
// Remove the second and third items from the array 
array.remove(1,2); 
// Remove the last and second-to-last items from the array 
array.remove(-2,-1); 

Он прекрасно работает. Но я хотел бы знать, может ли он расширяться, чтобы он мог принимать массив индексов в качестве первого аргумента?

В противном случае, я, вероятно, сделать еще один метод, который использует его:

if (!Array.prototype.removeIndexes) { 

    Array.prototype.removeIndexes = function (indexes) { 

     var arr = this; 

     if (!jQuery) 
      throw new ReferenceError('jQuery not loaded'); 

     $.each(indexes, function (k, v) { 

      var index = $.inArray(v, indexes); 

      if (index !== -1) 
       arr.remove(index); 

     }); 
    }; 
} 

Если Array.remove() не является расширяемым, чтобы соответствовать моим потребностям, что вы думаете о моем другом решении выше?

+2

http://codereview.stackexchange.com/ возможно? – techfoobar

+0

Не изменяйте объекты, которые у вас нет - даже если J. Resig делает это – tmaximini

+0

@techfoobar Спасибо, не знали об этом сайте. – Johan

ответ

1

Эта версия должна работать. Он изменяет исходный массив. Если вы предпочитаете возвращать новый массив без изменения оригинала, используйте инициализатор с комментариями result и добавьте return result в конце функции.

Array.prototype.removeIndexes = function(indices) { 
    // make sure to remove the largest index first 
    indices = indices.sort(function(l, r) { return r - l; }); 

    // copy the original so it is not changed 
    // var result = Array.prototype.slice.call(this); 

    // modify the original array 
    var result = this; 

    $.each(indices, function(k, ix) { 
    result.splice(ix, 1); 
    }); 
} 

> [0, 1, 2, 3, 4, 5, 6, 7, 8].removeIndexes([4, 5, 1]); 
> [0, 2, 3, 6, 7, 8] 
+0

http://jsfiddle.net/N8T5Q/ Я что-то пропустил? – Johan

+0

@Johan: эта функция возвращает новый массив без изменения оригинала. – DCoder

+0

Хорошо, его можно настроить так, чтобы он изменял фактический массив, в котором вы его используете? – Johan

0

Как насчет

Array.prototype.remove = function (indexes) { 
    if(indexes.prototype.constructor.name == "Array") { 
     // your code to support indexes 
    } else { 
     // the regular code to remove single or multiple indexes 
    } 

}; 
2

Я думаю, что это то, что вы ищете (Он работает с отрицательным индексом тоже):

if (!Array.prototype.removeIndexes) { 

    Array.prototype.removeIndexes = function (indexes) { 

     var arr = this; 

     if (!jQuery) throw new ReferenceError('jQuery not loaded'); 

     var offset = 0; 

     for (var i = 0; i < indexes.length - 1; i++) { 
      if (indexes[i] < 0) 
       indexes[i] = arr.length + indexes[i]; 
      if (indexes[i] < 0 || indexes[i] >= arr.length) 
       throw new Error('Index out of range'); 
     } 

     indexes = indexes.sort(); 

     for (var i = 0; i < indexes.length - 1; i++) { 
      if (indexes[i + 1] == indexes[i]) 
       throw new Error('Duplicated indexes'); 
     } 


     $.each(indexes, function (k, index) { 
      arr.splice(index - offset, 1); 
      offset++; 
     }); 
     return arr; 
    }; 
} 

var a = ['a', 'b', 'c', 'd', 'e', 'f']; 
var ind = [3, 2, 4]; 

a.removeIndexes(ind); 

console.log(a.join(', ')); 
// returns : a, b, f 

See fiddle

+0

Спасибо. Что произойдет, если я передам индекс, который не существует? Как '-1' – Johan

+0

Если индекс <0, его не следует использовать, правильно? – Johan

+1

Если вы указали неверный указатель, ошибка будет выбрана. Вы можете использовать отрицательные числа для выбора из конца массива (в качестве функции сращивания). – Damien