Как добавить элемент в массив по условию JS?

Есть массив вида
[
    {src: 'some-path-1', video: 'some-path-1'},
    {src: 'some-path-2', video: 'some-path-2'},
    {src: 'some-path', video: null},
]

Мне необходимо, в зависимости от наличия значения в поле video у элемента массива, вставлять в массив перед таким элементом новый элемент, вида
{src_video: 'video value'}
Т е из массива выше должен получиться такой массив
[
    {src_video: 'some-path-1'},
    {src: 'some-path-1', video: 'some-path-1'},
    {src_video: 'some-path-2'},
    {src: 'some-path-2', video: 'some-path-2'},
    {src: 'some-path', video: null},
]


Подскажите как бы такое реализовать наиболее элегантным способом?
Спасибо
  • Вопрос задан
  • 123 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
const result = arr.reduce(
  (acc, cur) => {
    if (cur.video !== undefined) {
      acc.push({ src_video: cur.video });
    }
    acc.push(cur);
    return acc;
  },
  [],
)
// Array(5) [ {…}, {…}, {…}, {…}, {…} ]
​// 0: Object { src_video: "some-path-1" }
// ​1: Object { src: "some-path-1", video: "some-path-1" }
​// 2: Object { src_video: "some-path-2" }
// 3: Object { src: "some-path-2", video: "some-path-2" }
​// 4: Object { src: "some-path", video: null }
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Элегантный способ - это не всегда хорошо. Если массив не занимает мегабайты данных, то самым простым способом будет создание нового выходного массива нулевой длины, а потом, просто перебирая элементы оригинального массива, вставляете их в новый массив, а в нужные моменты просто вставляйте сперва эту вставку , а потом сразу элемент оригинального массива.
И не нужны вам эти "шикарные" reduce в данной ситуации. Обычный цикл for. Потому что reduce совершенно бесполезен конкретно в данном случае, а читаемость ухудшит.

const arr = [
    {src: 'some-path-1', video: 'some-path-1'},
    {src: 'some-path-2', video: 'some-path-2'},
    {src: 'some-path', video: null},
];

const result = [];
for (let i = 0; i < arr.length; i++) {
  if (arr[i]?.video) {
    result.push({ src_video: arr[i].video });
  }
  result.push(arr[i]);
}

console.log(result);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы