javascript - 在 .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 ?那不应该是一样的吗?acc
limit
acc["limit"] = 25
解决方案
中的回调函数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, {});
推荐阅读
- android - 警报管理器类在给定的日期和时间不工作
- here-api - 在巴西计算路线时的通行费总成本不正确
- python-3.x - 通过镜像创建 Softlayer 的 VM
- postgresql - 根据 Helm 图表设置值
- optimization - 使用 CVXpy 进行投资组合优化 - CVX101 Boyd
- keras - 二进制编码(非单热编码)分类数据的 Keras 自定义损失函数
- spring - Spring Security,更新 SecurityContextHolder
- python - 了解 Airflow 中的 execution_date
- three.js - Three.JS 中的三角形-三角形交点
- c# - Visual Studio 调试器在虚拟属性集上崩溃