这是有问题的代码:
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
一样吗?
答案 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, {});