Установка свойства для пустого объекта создает строку при использовании в .reduce () - PullRequest
0 голосов
/ 27 сентября 2018

Вот код, о котором идет речь:

Object.entries({
    orderStatus: null,
    orderType: null,
    limit: 25,
    offset: null,
    sortFields: null
}).reduce((acc, [a, b]) => b ? acc[a] = b : acc, {});

console.log показывает, что первый раз установлен acc[a], он просто заменяет acc на строку в a, затем пытается назначитьсвойство acc (которое теперь является строкой) и выдает ошибку TypeError.Когда я использую:

.reduce((acc, [a, b]) => b ? {...acc, ...{[a]: b}} : acc, {});

, это работает как сон.Зачем acc[a] устанавливать acc в 25, когда оно достигает limit?не должно ли это быть таким же, как acc["limit"] = 25?

1 Ответ

0 голосов
/ 27 сентября 2018

Функция обратного вызова в reduce должна возвращать накопленное значение.

В вашем условном выражении вы возвращаете объект в acc, когда b равно false.

Но когда это правда, вы возвращаете acc[a] = b.Это возвращает значение, которое было присвоено, т.е. b, а не значение acc.

Лучший способ записать это было бы с обычным if:

.reduce((acc, [a, b]) => { 
    if (b) {
        acc[a] = b;
    }
    return acc; }, {})

Вы также можете использовать запятую для выполнения присваивания и затем возвращать объект отдельно:

.reduce((acc, [a, b]) => b ? (acc[a] = b, acc) : acc, {});
...