使用完全限定字符串设置JSON属性

Set JSON property with fully qualified string

本文关键字:字符串 设置 JSON 属性      更新时间:2023-09-26

这个问题和我想做的正好相反。基本上,我有这个对象:

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');