Правильный доступ к значениям внутреннего массива с помощью ForEach () - JavaScript - PullRequest
0 голосов
/ 29 мая 2019

у меня

b = [1, 2, 3, [4, 5], 6];

b.forEach((value, index) => {
    if (Array.isArray(value)) {
        value.forEach(element => element += 2)
    }
    else {
        value += 2;
    }
    console.log(`The value at ${index} is ${value}`);
})

И мне интересно, почему это ведение журнала

Значение 3 равно 4,5

Вместо

Значение 3 равно 6,7

Я думал, что получил доступ к внутреннему массиву, проверив, является ли значение массивом, и затем я сделал еще один цикл .forEach для доступа к каждому элементу этого внутреннего массива?

Пытаться полностью понять .forEach() в JS. Спасибо!

Ответы [ 2 ]

3 голосов
/ 29 мая 2019

Существует две причины:

  1. forEach полностью игнорирует значение, которое вы возвращаете из его обратного вызова

  2. Вы никогда ничего не делаете для обновленияvalue

Если вы хотите изменить value, вы можете сделать следующее:

value = value.map(element => element + 2);

..., что создает newМассив и присваивает его value;обратите внимание, что b совершенно не затронут.(Это как ваш value += 2 в другой ветке, что также никак не влияет на b.) Пример в реальном времени:

const b = [1, 2, 3, [4, 5], 6];

b.forEach((value, index) => {
    if (Array.isArray(value)) {
        value = value.map(element => element + 2);
    }
    else {
        value += 2;
    }
    console.log(`The value at ${index} is ${value}`);
})
// Just to show that `b` is unaffected:
console.log(`b[3] = ${b[3]}`);

Или вот это:

value.forEach((element, index) => {
    value[index] = element + 2;
});

... который изменяет исходный массив (внутри b), а не соответствует ветви else (которая не обновляется b).Живой пример:

const b = [1, 2, 3, [4, 5], 6];

b.forEach((value, index) => {
    if (Array.isArray(value)) {
        value.forEach((element, index) => {
            value[index] = element + 2;
        });
    }
    else {
        value += 2;
    }
    console.log(`The value at ${index} is ${value}`);
})
// Just to show that `b` is modified:
console.log(`b[3] = ${b[3]}`);

Но , если вы хотите изменить b, вам, вероятно, следует делать это последовательно. Кобе опубликовал как вы это сделаете с map, который создает новый массив и часто является тем, что вы хотите.Если вы хотите обновить существующий массив, то:

const b = [1, 2, 3, [4, 5], 6];
for (const [bIndex, value] of b.entries()) {
    if (Array.isArray(value)) {
        for (const [vIndex, entry] of value.entries()) {
            value[vIndex] = entry + 2;
        }
    } else {
        b[bIndex] = value + 2;
    }
}
console.log(`b = ${JSON.stringify(b)}`);

... но Решение Кобе map обычно является тем, к чему я бы стремился, если у меня не было веской причины для обновления на месте.

1 голос
/ 29 мая 2019

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

b = [1, 2, 3, [4, 5], 6];

b.forEach((value, index) => {
    if (Array.isArray(value)) {
        value.forEach((element, i) => value[i] += 2)
    } else {
        value += 2;
    }
    console.log(`The value at ${index} is ${value}`);
})

Если вы не хотите писать это, используйте map для возврата нового массива с измененными значениями:

b = [1, 2, 3, [4, 5], 6];

b = b.map(value => Array.isArray(value) ? value.map(el => el + 2) : value + 2)

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