在 JavaScript 中的对象中设置具有未知深度的属性值
set a property's value with unknown depth within an object in javascript
var params = {
search: {
make: "",
model: ""
}
}
function setVariable() {
var value = "BMW";
var key = "search.make";
var arr = key.split("."); //eg. ["search", "make"]
params[arr[0]][arr[1]] = value; // this works, but how do you
// do it with unknown arr[] length?
}
如何在未知arr[]
长度下执行此操作?
我推测我可能需要做一个递归调用,也许在函数中传递类似arr.slice(1)
的东西,但我无法弄清楚它应该是什么样子。
var params = {
search: {
make: "",
model: "",
whatever: {
foo: {
bar: {
moo: 123,
meow: 'xyz'
}
}
}
}
};
function updatePath(obj, path, value) {
var parts = path.split('.');
var i, tmp;
for(i = 0; i < parts.length; i++) {
tmp = obj[parts[i]];
if(value !== undefined && i == parts.length - 1) {
tmp = obj[parts[i]] = value;
}
else if(tmp === undefined) {
tmp = obj[parts[i]] = {};
}
obj = tmp;
}
return obj;
}
演示:
> updatePath(params, 'search.whatever.foo.bar')
{ moo: 123, meow: 'xyz' }
> updatePath(params, 'search.whatever.foo.bar.moo')
123
> updatePath(params, 'search.whatever.foo.bar.moo', 'test')
'test'
> updatePath(params, 'search.whatever.foo.bar.moo')
'test'
> updatePath(params, 'search.whatever.foo.bar')
{ moo: 'test', meow: 'xyz' }
> updatePath(params, 'search.whatever.foo.bar.x.y.z', 'hi')
'hi'
> updatePath(params, 'search.whatever.foo.bar.x')
{ y: { z: 'hi' } }
> updatePath(params, 'search.whatever.foo.bar')
{ moo: 'test',
meow: 'xyz',
x: { y: { z: 'hi' } } }
>
以下代码遍历params
对象,直到找到给定的键。它假定key.split(".")
返回正确的键数组(因此您可能需要在此处进一步清理输入。
var params = {
search: {
make: "",
model: ""
}
}
function setVariable() {
var value = "BMW";
var key = "search.make";
var arr = key.split("."); //eg. ["search", "make"]
var runner = params;
for( var i=0, max=arr.length-1; i<max; ++i ) {
// make sure the key exists
runner[ arr[i] ] = runner[ arr[i] ] || {};
// move one level deeper
runner = runner[ arr[i] ];
}
// set the value in the last level
runner[ arr[arr.length-1] ] = value;
}
编辑:对Felix Kling的评论:它假设您希望生成以前不存在的密钥。否则,您必须对for
循环进行进一步检查并离开函数(如果密钥不存在(,而不是创建它。
相关文章:
- 在不知道深度或父属性的情况下从对象中删除属性
- 递归深度比较
- 如何对映射插件创建的敲除对象进行深度复制
- 对广告服务器的未知信标调用
- 3d上的深度比例错误
- Axios spread()具有未知数量的回调参数
- 将对象从另一个不可变的Map分配给Map是否意味着深度克隆
- 反汇编的javascript jit代码调用未知函数
- 未知”<#"构造
- BatmanJS:深度嵌套路由
- Chai深度包含了对嵌套对象的断言
- Safari 5.1.7下载文件名未知的csv文件
- JavaScript:将线性JSON数组转换为深度未知的树结构
- 在 JavaScript 中的对象中设置具有未知深度的属性值
- 如何获得未知JSON层次结构的总深度
- 我怎么能找到关键在JavaScript对象时,他的深度是未知的
- 编写一个递归函数,迭代嵌套循环的深度未知
- 迭代未知深度的对象
- Javascript-在深度嵌套对象上迭代并更改某些未知值
- 用jQuery从未知深度的嵌套JSON构建级联下拉列表