Предотвратить двойные скобки при перемещении элементов массивов

avatar
Gibberish
1 июля 2021 в 15:44
68
5
-2

У меня есть два массива (a и b), где каждый элемент должен быть перемещен в другой массив (c)

Для этого я использовал метод push/slice, но он добавляет скобки в каждый элемент.

Вот код:

let a = [0, 6, 2, 0, 1, 1];
let b = [1, 3, 9, 0, 0, 1];
let c = [];
for (let i = 5; a.length > 0 || b.length > 0; i--) {
    c.push(a.splice(i, 1), b.splice(i, 1));
}
console.log(c) // I would like [element1, element2, etc]

Вместо этого есть другой метод (для замены c.push(a.splice(i, 1), b.splice(i, 1))) который не добавляет скобки к каждому элементу ?

Спасибо!

Источник
Jaromanda X
1 июля 2021 в 15:46
2

c.push(...a.splice(i, 1), ...b.splice(i, 1))

Pointy
1 июля 2021 в 15:46
3

Я не уверен, что понимаю, почему .splice() вообще задействован, но проблема в том, что .splice() возвращает массив.

Jaromanda X
1 июля 2021 в 15:47
0

@Pointy - возможно, он хочет удалить элементы из a и b?

Antoni
1 июля 2021 в 15:47
2

используйте pop вместо splice (pop не требует аргументов)

Pointy
1 июля 2021 в 15:48
0

@JaromandaX, возможно, но в вопросе нет объяснения.

Antoni
1 июля 2021 в 15:49
1

c.push(a.pop(), b.pop())

Jaromanda X
1 июля 2021 в 15:49
0

@Pointy - да, я знаю "p

Antoni
1 июля 2021 в 15:50
0

удаление элементов - хороший способ "переместить" их, чтобы убедиться, что у вас нет двойников

Jaromanda X
1 июля 2021 в 15:51
0

@Thomas - был дан лучший вариант ... вместо этого используйте .pop (), поскольку ваш код всегда удаляет элементы с конца каждого массива.

Jaromanda X
1 июля 2021 в 15:54
0

используя ваш код (и .pop), массив результатов находится в обратном порядке ... это требование?

Gibberish
1 июля 2021 в 15:54
0

Хорошо бы сохранить первоначальный порядок...

VLAZ
1 июля 2021 в 16:32
0

Нужно ли удалять элементы из a и b? Или цель просто объединить их в c?

Pointy
1 июля 2021 в 16:35
0

Если нет необходимости очищать массивы a и b, достаточно простой индексации массива.

Ответы (5)

avatar
Jaromanda X
1 июля 2021 в 15:58
2

на основании комментария "было бы неплохо оставить их в том же порядке"

используя другой ответ, используйте .pop .. используйте .shift для удаления из начала массива вместо конца

также вместо этого можно использовать цикл while

let a = [0, 6, 2, 0, 1, 1];
let b = [1, 3, 9, 0, 0, 1];
let c = [];
while(a.length > 0 || b.length) {
    c.push(a.shift(), b.shift());
}
console.log(c) 

Конечно, вышеизложенное нормально, если длины массивов одинаковы

Но, исходя из исходного кода... это работает с массивами неравной длины:

let a = [0, 6, 2, 0, 1, 1];
let b = [1, 3, 9, 0, 0, 1, 99];
let c = [];
while(a.length > 0 || b.length) {
    c.push(...a.splice(0,1), ...b.splice(0, 1));
}
console.log(c)

Обратите внимание, что соединение всегда имеет индекс 0 — для поддержания порядка

avatar
VLAZ
1 июля 2021 в 17:03
0

Простой цикл for для одновременного прохождения обоих a и b и добавления элемента, если он есть:

let a = [0, 2, 4, 6, 8, 10, 12, 14];
let b = [1, 3, 5, 7, 9];
let c = [];

for (let i = 0; i < Math.max(a.length, b.length); i++) {
  if (i < a.length)
   c.push(a[i]);
  if (i < b.length)
   c.push(b[i]);
}

console.log(c);

Это предполагает, что массивы будут иметь неравную длину. Если они всегда будут равны, то операторы if не нужны.

Альтернативная реализация для массивов одинаковой длины:

let a = [0, 2, 4, 6, 8, 10];
let b = [1, 3, 5, 7, 9, 11];
let c = a.flatMap((x, i) => [x, b[i]]);

console.log(c);

Если a и b в конце должны оказаться пустыми, это может быть просто:

a.length = 0; 
b.length = 0;

после создания c вместо постоянного изменения двух массивов.

avatar
Antoni
1 июля 2021 в 15:58
0

я уже прокомментировал это, но это ответ, так что вот ответ

let a = [0, 6, 2, 0, 1, 1];
let b = [1, 3, 9, 0, 0, 1];
let c = [];
for (let i = 5; a.length > 0 || b.length > 0; i--) {
    c.push(a.pop(), b.pop());
}
console.log(c);
avatar
Abhishek Sheoran
1 июля 2021 в 15:55
-1

Синтаксис расширения — это новое дополнение к набору операторов в JavaScript ES6. Он принимает итерируемый объект (например, массив) и расширяет его до отдельных элементов.

Синтаксис расширения обычно используется для создания поверхностных копий объектов JS. Использование этого оператора делает код кратким и повышает его читабельность.

Итак, вместо этого используйте :

let a = [0, 6, 2, 0, 1, 1];
let b = [1, 3, 9, 0, 0, 1];
let c = [...a,...b]
console.log(c)
Antoni
1 июля 2021 в 15:55
0

это не то, что хочет оп

Jaromanda X
1 июля 2021 в 15:56
1

значения не будут чередоваться

Gibberish
1 июля 2021 в 15:59
0

Спасибо, но это не совсем то, о чем я просил

VLAZ
1 июля 2021 в 17:06
0

@C.O. Это не ответ только по ссылке. В нем вообще нет ссылки. Почему вы отметили это как таковое?

C.O.
1 июля 2021 в 17:54
0

Я был идиотом, в очереди обзора была ссылка на сообщение SO сверху, и я принял это за «ответ» на вопрос, извините.

avatar
The Bomb Squad
1 июля 2021 в 15:53
1

Используя ваш точный ответ, все, что я сделал, это получил доступ к 0 местоположению в каждой соединенной вещи

let a = [0, 6, 2, 0, 1, 1];
let b = [1, 3, 9, 0, 0, 1];
let c = [];
for (let i = 5; a.length > 0 || b.length > 0; i--) {
    c.push(a.splice(i, 1)[0], b.splice(i, 1)[0]);
}
console.log(c) // I would like [element1, element2, etc]
Andreas
1 июля 2021 в 15:55
0

Зачем заново изобретать Array.prototype.pop()?

The Bomb Squad
1 июля 2021 в 15:57
0

в вопросах разве мы не должны скорректировать проверенный код OP в сторону ответа? На это есть несколько ответов, но это самая быстрая настройка