Как удалить каждый второй и третий элемент из массива в Javascript?


Я хочу удалить каждый второй и третий элемент из массива в Javascript.

Мой массив выглядит так:

var fruits = ["Banana", "yellow", "23", "Orange", "orange", "12", "Apple", "green", "10"];
Теперь я хочу удалить каждый второй и третий элемент. Результат будет выглядеть так:
["Banana", "Orange", "Apple"]

Я попытался использовать for-loop и splice:

for (var i = 0; fruits.length; i = i+3) {
    fruits.splice(i+1,0);
    fruits.splice(i+2,0);
};

Конечно, это возвращает пустой массив, потому что элементы удаляются, пока цикл все еще выполняется. Как я могу сделать это правильно?

Спасибо.

6 6

6 ответов:

Вы можете подойти к этому с другого угла и push() значение, которое вы не хотите удалять в другой массив:

var firstFruits = []

for (var i = 0; i < fruits.length; i = i+3) {
    firstFruits.push(fruits[i]);
};
Этот подход, возможно, не так скуп, как использование splice(), но я думаю, что вы видите выигрыш в плане читаемости.

Это работает для меня.

var fruits = ["Banana", "yellow", "23", "Orange", "orange", "12", "Apple", "green", "10","Pear","something","else"];

for(var i = 0; i < fruits.length; i++) {
    fruits.splice(i+1,2);
}

//fruits = Banana,Orange,Apple,Pear

Вот демонстрация, которая иллюстрирует это немного лучше: http://jsfiddle.net/RaRR7/

Можно использовать фильтр:

var filtered = [
   "Banana", 
   "yellow", 
   "23", 
   "Orange", 
   "orange", 
   "12", 
   "Apple", 
   "green", 
   "10"
].filter(function(_, i) {
    return i % 3 === 0;
})

Возвращает:

["Banana", "Orange", "Apple"]

Попробуйте выполнить цикл через массив в обратном порядке

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

Вы захотите двигаться по массиву назад, а затем, если i % 2 == 0 || i%3 == 0, то сращивайте элемент из массива