Как изменить определенные ненулевые значения в массиве со значениями другого массива в Javascript - PullRequest
1 голос
/ 04 июня 2019

У меня есть два массива, в которых один имеет нулевые значения, а другой только числа без нулевых значений.Примерно так:

array1 = [0,0,0,4,5,0,0,0,0,0,0,0]

array2 = [456, 299]

Теперь я хочу обменять ненулевые числа array1 с числами array2.

То, что в итоге получается так:

array1 = [0,0,0,456,299,0,0,0,0,0,0,0]

Я уже пробовал это:

let array1 = [0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0]

let array2 = [456, 299]

let j = 0

for (i = 0; i <= array1.length; i++) {
  if (array1[i] != 0) {
    array1[i] = array2[j]
    j++
  } else {
    array1[i] = 0
  }
}


console.log(array1)

Это не сработает, потому что j не определено в цикле.

Кто-нибудь может мне помочь?Очень ценится!

Ответы [ 4 ]

3 голосов
/ 04 июня 2019

Вы можете отобразить значения и принять за истинное значение смещенное значение из другого массива.

var array1 = [0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0],
    array2 = [456, 299],
    result = array1.map(v => v && array2.shift());

console.log(...result);

Версия без мутаций с закрытием по индексу.

var array1 = [0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0],
    array2 = [456, 299],
    result = array1.map((i => v => v && array2[i++])(0));

console.log(...result);
2 голосов
/ 04 июня 2019

Вы можете взять итератор из array2 и вызвать next для него, чтобы получить каждое значение по очереди, когда вы map обращаетесь к другому массиву:

let array1 = [0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0]
let array2 = [456, 299]

let it = array2[Symbol.iterator]()
let res = array1.map(n => n && it.next().value)

console.log(res)

Если у вас заканчиваются значения в array2, это добавит undefined s в массив - неясно, возможно ли это или каково должно быть правильное поведение.

1 голос
/ 04 июня 2019

Вы можете использовать карту с каррированным IIFE, поэтому вам не нужно создавать переменные, которые используются только в функции карты вне функции карты.

Работает, если элементы, отличные от нуля массива1, не большечем длина массива 2.

const array1 = [0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0];
const array2 = [456, 299];

console.log(
  array1.map(
    (index => item =>
      item !== 0 ? array2[index++] : item)(0)
  )
);

Версия не IIFE:

const array1 = [0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0];
const array2 = [456, 299];
//create an index variable to be used in the map function
let index = 0;
console.log(
  array1.map(item => (item !== 0 ? array2[index++] : item))
);
1 голос
/ 04 июня 2019

Так как вы используете i <= array.length, то ваша другая часть продолжает добавлять значение, равное последнему из array1, и вы сталкиваетесь с infinite loop, или вы можете просто использовать i < array1.length

Просто удалитеостальная часть вам здесь больше не нужна

let array1 = [0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0]

let array2 = [456, 299]

let j = 0

for (i = 0; i <= array1.length - 1; i++) {
  if (array1[i] != 0) {
    array1[i] = array2[j]
    j++
  }
}


console.log(array1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...