Как уменьшить javascript, если начальное значение - массив - PullRequest
0 голосов
/ 12 апреля 2020

var a = [2,4,5,6,7]
a.reduce((acc,cur,i)=>acc,[])
//result : []
a.reduce((acc,cur,i)=>acc,[0,2])
//result (2) [0, 2]
a.reduce((acc,cur,i)=>acc[0],[0,2])
/*
VM410:1 Uncaught TypeError: Cannot read property '0' of undefined
    at <anonymous>:1:26
    at Array.reduce (<anonymous>)
    at <anonymous>:1:3
    */

почему я получаю ошибку для третьего? Хотите знать, как это работает?

Ответы [ 3 ]

2 голосов
/ 12 апреля 2020

Функция сокращения работает как a для l oop, где переменная (a cc) устанавливается на каждой итерации:

Первые два примера, которые вы дали:

var a = [2,4,5,6,7]

a.reduce((acc,cur,i) => acc, []) 
a.reduce((acc,cur,i) => acc, [0, 2])

Эквивалентно присвоению себе аккумулятора на каждой итерации:

var acc = []; // [0, 2] in the second one

for(var i=0; i < a.length; i++){
    acc = acc;
}

В то время как ваш последний пример:

a.reduce((acc,cur,i) => acc[0], [0, 2])

Эквивалентно присвоению a cc его первое значение на каждой итерации:

var acc = [0, 2];

for(var i = 0; i < a.length; i++){
    acc = acc[0];
}

Каждая итерация присваивает a cc его первое значение. Первая итерация будет выглядеть так:

acc = [0, 2];
i = 0

acc = acc[0] // 0;

Вторая итерация будет выглядеть следующим образом:

acc = 0;
i = 1

acc = acc[0] // undefined;

Теперь a cc назначено значение не определено , поскольку такого свойства нет 0 в значении a cc. Поэтому третья итерация будет выглядеть следующим образом:

acc = undefined;
i = 2;

acc = acc[0]; // Error, no property '0' of undefined.
1 голос
/ 12 апреля 2020

Ваш код не возвращает массив. Тем не менее, аккумулятор будет установлен на это значение. Поэтому, хотя вы предполагаете, что acc является массивом, это не после первого вызова функции накопления.

Вместо этого вы можете сделать что-то вроде следующего:

    var a = [2,4,5,6,7]; 
    a.reduce((acc,cur,i) => {
            acc.push(cur);
            console.log(`iter ${i}, acc = ${JSON.stringify(acc)}.`);
            return acc;
       }
      ,[0,2]
    );

Просто убедитесь, что ваш обратный вызов возвращает массив при каждом вызове.

0 голосов
/ 12 апреля 2020

Выдержка из документации mdn для Array.reduce

initialValue -Значение, используемое в качестве первого аргумента для первого вызова обратного вызова. Если не указано значение initialValue, первый элемент в массиве будет использоваться в качестве начального значения аккумулятора и пропускается как currentValue. Вызов метода Reduce () для пустого массива без initialValue вызовет ошибку TypeError.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

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