1 Вопрос: Javascript | Как добавить элемент в массив каждые n элементов, начиная с индекса x?

вопрос создан в Thu, May 2, 2019 12:00 AM

Скажем, у меня есть массив:

var cars = ["Saab", "Volvo", "BMW", "Audi", "Nissan", "Ford"];

Я хочу добавить еще один элемент "Triumph" каждые 2 элемента, начиная с индекса 2, чтобы получить это

cars
["Saab", "Volvo", "Triumph", "BMW", "Audi", "Triumph", "Nissan", "Ford", "Triumph"];

Я пробовал это:

for (let [index, val] of cars.entries()) {
    if (index % 2 == 0) {
        cars.splice(index, 0, "")
    }
}

но он добавляет новый элемент каждый второй элемент, а не каждые 2, и я не уверен, как заставить его начинать с определенного индекса

[ '', 'Saab', '', 'Volvo', '', 'BMW', '', 'Audi', '', 'Nissan', '', 'Ford'] р>     

- 3
  1. какие усилия вы предприняли?
    2019-05-02 14: 43: 26Z
  2. Пожалуйста, прочитайте Как спросить . Мы не ценим вопросы типа «Я хочу» здесь. Покажите нам, что вы пытались, или, по крайней мере, объясните, что вы думаете о том, как это можно сделать, до сих пор.
    2019-05-02 14: 44: 49Z
  3. Я добавил свою попытку
    2019-05-02 15: 07: 37Z
  4. изменить индекс% 2 на индекс% 3
    2019-05-02 15: 09: 46Z
  5. просто! спасибо, ребята
    2019-05-02 15: 11: 02Z
1 ответ                              1                         

Я бы порекомендовал использовать обратную итерацию, чтобы не изменять тот же массив, через который вы перебираете, так как это изменит индексы.

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

р>

const cars = ["Saab", "Volvo", "BMW", "Audi", "Nissan", "Ford"];

const insertAfterN = (arr, n, str) => {
  let newArray = [...arr];
  const addToEnd = newArray.length % n === 0;

  for (let i = newArray.length - 1; i >= 0; i--)
    if (i % 2 == 0 && i !== 0) newArray.splice(i, 0, str)

  if (addToEnd) newArray.push(str);
  return newArray;
}

//Insert <"Triumph"> into the <cars> array after every <2> items
const result = insertAfterN(cars, 2, "Triumph");
console.log( result );

Если вы хотите что-то более краткое, вы можете использовать reduce() :

р>

const cars = ["Saab", "Volvo", "BMW", "Audi", "Nissan", "Ford"];

const insertAfterN = (arr, n, str) => {
  const addToEnd = arr.length % n === 0;
  const result = arr.reduce((a,i,idx) => { idx && !(idx%n) ? a.push(str,i) : a.push(i); return a; }, []);
  if (addToEnd) result.push(str);
  return result;
}

//Insert <"Triumph"> into the <cars> array after every <2> items
const result = insertAfterN(cars, 2, "Triumph");
console.log( result );
    
0
2019-05-02 18: 21: 12Z
источник размещен Вот