在.reduce()中使用时,在空对象上设置属性会创建一个字符串

时间:2018-09-27 15:32:09

标签: javascript typeerror reduce

这是有问题的代码:

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,就将limit设置为25?不应该和acc["limit"] = 25一样吗?

1 个答案:

答案 0 :(得分:0)

reduce中的回调函数必须返回累加值。

在条件表达式中,当acc为false时,将在b中返回对象。

但是如果这是事实,您将返回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, {});