javascript - 如何设置 JavaScript 对象的属性值?
问题描述
我有一个看起来像这样的 JavaScript 对象:
obj = {
person: {
male: true,
age: 10
},
state: {
quit: false,
rain: -3
},
game: {
settings: {
lang: 'en',
os: 'win',
ver: 10,
},
},
next: 55,
last: 10,
};
我想创建一个可用于设置任何 obj 值的函数,如下所示:
function updateObj( property /*: string[]*/, value /*: any*/ ) {
obj[property[0]][property[1]] = value; <-- How to generalize?
}
那么我可以做这样的事情:
updateObj( ['person', 'male'], false );
updateObj( ['state', 'rain'], 19 );
但是,如果属性参数长度不等于 2,则当前实现将无法正常工作。这行代码如何:
obj[property[0]][property[1]] = value;
可以推广到任何数组大小的属性?
解决方案
下面的方法将达到你的结果,使用reduceRight下面
// with reduceRight
function updateObj(prop, value) {
prop = prop.reverse()
prop.reduceRight((o, d, i) => i == 0 ? (o[d] = value): o[d] , obj)
}
// with Reduce (efficient than above)
function updateObj(prop, value) {
prop.reduce((o, d, i) => i == prop.length -1 ? (o[d] = value): o[d] , obj)
}
updateObj( ['person', 'male'], false );
updateObj( ['state', 'rain'], 19 );
推荐阅读
- c# - 如何修复 MissingReferenceException 告诉我游戏对象在我没有销毁时已被销毁?
- c# - 从 html 字符串中获取 html 输入控件及其值
- javascript - 跨浏览器区分右键单击和上下文菜单键
- java - Java DecimalFormat 瑞典语区域设置“se_SV”负数格式
- r - 匿名化 R 中每个不同行的数据
- html - 根据单元格大小的灵活表格
- sql-server - 具有日期约束的 SQL Server 2014 触发器
- networkx - 在 Networkx color_map 上接收密钥错误
- node.js - 找不到变量 self
- r - 在 x 轴标签上插入 pch 符号