使用完全限定字符串设置JSON属性
Set JSON property with fully qualified string
这个问题和我想做的正好相反。基本上,我有这个对象:
var a = {
b: {
c: 'Foo'
}
}
我需要做的是设置给定字符串'b.c'的c的值。不幸的是,我不能这样做:
a['b.c'] = 'Bar'
据我所知,上面的问题并没有让我接近,因为它只是复制了对象属性的值,以便可以读取它们。但是,它不能帮助我设置对象属性的值。以下是目前为止的内容:
var key = 'b.c'.split('.');
for (var i = 0; i < key.length; i++) {
// do something
}
这是一个功能的方法,这是你需要的吗?它不使用特定的a[string]
语法,而是一个函数,您可以在其中传递对象字符串和要设置的值:
var obj = { foo: { bar: { lol: { lulz: 69 } } } };
function setProp(obj, prop, value) {
var props = prop.split('.');
return [obj].concat(props).reduce(function(a,b,i) {
return i == props.length ? a[b] = value : a[b];
});
}
setProp(obj, 'foo.bar.lol.lulz', 'hello world');
console.log(obj.foo.bar.lol.lulz); //=> "hello world"
您必须拦截循环的最后一次迭代,并从那里赋值而不是重新定义您的temp变量。
我改编了你链接到将值2
分配给a.b.c
的问题的答案:
var a = {
"b" : {
"c" : 1
}
}
var n = "b.c".split(".");
var x = a;
for(var i = 0; i < n.length; i++){
if(i == n.length-1) {
x[n[i]] = 2;
} else {
x = x[n[i]];
}
}
http://jsfiddle.net/Fuhbb/这就是@Ian在他的jsfiddle中所做的事情。而不是if
,他循环少了一步,然后在循环后处理赋值。
声明一下,我最终想出了另一种方法:
function setProperty(obj, props, val) {
if (obj[props[0]] instanceof Object) {
setProperty(obj[props[0]], props.slice(1, props.length), val);
return;
}
obj[props[0]] = val;
}
这样写:
a = {
b: {
c: 'Foo'
}
};
var whatever = 'b.c';
var props = whatever.split('.');
setProperty(a, props, 'Bar');
相关文章:
- 将字符串的一部分设置为数组的一部分
- 将localStorage字符串设置为Integer
- 从 UTC 字符串设置日期格式
- 如何根据 URL 中符号后的第一个字符串设置变量
- 从本地存储 base64 字符串设置背景图像
- 从类似 csv 的字符串设置文本字段值
- 将 CodeMirror 子字符串设置为粗体而不更改模式
- jQuery:从参数字符串设置表单状态
- 如何使用字符串设置局部变量
- 按数字和字符串设置新的 Date() 会给出不同的结果
- 将字符串设置为类似日期的格式
- 避免基于特定URL字符串设置cookie
- 如何在将javascript字符串设置为从Django变量传播的值时转义引号
- 使用完全限定字符串设置JSON属性
- 需要根据模型数据中的字符串设置复选框
- 使用来自java类的字符串设置输入值
- 使用包含英国格式日期的字符串设置new Date()
- CRM 2011:使用javascript从字符串设置日期时间字段
- 将一个HTML字符串设置为等于javascript中的一个变量
- 如何将逗号分隔字符串设置为参数