В качестве splice
изменений длина вам нужно либо переместить итератор, либо итерировать вниз.
Вы также должны использовать for
, не for..in
для перебора над составлять список присяжных заседателей
var arr = [{id:0, type:1}, {id:1, type:1}, {id:2, type:2}];
var type = 1,
i; // OR // i = arr.length;
for (i = arr.length - 1; i >= 0; --i) { // while (i-- > 0) {
if (arr[i].type == type) {
arr.splice(i, 1);
}
}
arr; // [{"id": 2, "type": 2}]
Других ответов предлагают использовать фильтр метода Массивов который является отличным альтернативным вариантом и вы можете найти его чище. Тем не менее, следует помнить, результат этих двух способов немного отличаются в этом случае будет модифицировать исходный массива ссылки («имеет побочные эффекты»), в то время как фильтр метод создаст совершенно новый экземпляр массива и оставить оригинал нетронутым.
Вы можете думать о фильтра как это, который также показывает, почему это немного дороже
function filter(arr, test) {
var i,
arr_out = [];
for (i = 0; i < arr.length; ++i)
if (i in arr && test(arr[i]) // invoking test each time is expensive
arr_out.push(arr[i]);
return arr_out;
}
splice
может быть дорогим тоже, однако, как вы двигаетесь все indicies вокруг.
Самый дешевый способ сделать это без побочные эффекты (то есть оригинал, оставленный в покое) состоит в том, чтобы сделать сочетание двух; ручной for
петля, которая push
эсов к новому массива с амбулаторным тестом записываются в него, не вызывается отдельно
// arr as before
var arr2 = [],
i;
for (i = 0; i < arr.length; ++i)
if (arr[i].type === type) // doing our test directly, much cheaper
arr2.push(arr[i]);
arr2; // desired array
Для оригинального модифицированного простого варианта заключается в использовании метода splice
я написал в начале этого ответ.
Другой вариант, чтобы скопировать оригинал, var arr2 = arr.slice()
, затем опорожнить оригинал, arr.length = 0;
, затем сделать последний цикл, который я показал, кроме как с arr
и arr2
поменялись местами вокруг повторно заполнить arr
Ваш первый буквальным является недействительным синтаксис –
Я думаю, лет u означало '[{id: 0, type: 1}, {id: 1, type: 1}, {id: 2, type: 2}]' вместо '{{id: 0, type: 1} , {id: 1, type: 1}, {id: 2, type: 2}} ' – saadq