首页 > 解决方案 > 在 .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为 in 中的字符串a,然后尝试将属性分配给acc(现在是字符串)并抛出 TypeError。当我使用:

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

它就像一个梦。为什么一旦命中就会acc[a]设置为25 ?那不应该是一样的吗?acclimitacc["limit"] = 25

标签: javascripttypeerrorreduce

解决方案


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

在你的条件表达式中,你返回的对象是acc什么时候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, {});

推荐阅读