是否有必要在使用之前创建嵌套的jSON对象?

时间:2016-11-02 15:46:22

标签: javascript json

我想我已经看过如何在没有事先准备的情况下创建JSON对象。这就是我准备它的方式:

obj = {
  0:{
    type:{}
  },
  1:{},
  2:{}
};

现在我想我可以插入一个类似obj.0.type = "type0";的值但是我想在使用它时创建它:obj['0']['type'] = "Type0";

有可能,还是我需要准备它?我想在飞行中创造它"!

修改

我想创建JS对象"动态"。

var obj = {};
obj.test = "test"; //One "layer" works fine.
obj.test.test = "test" //Two "layers" do not work... why?

4 个答案:

答案 0 :(得分:1)

obj = {
  0:{
    type:{}
  },
  1:{},
  2:{}
};
  

现在我认为我可以插入如下值:obj.0.type =" type0&#34 ;;

我猜你的意思是"分配"一个值,而不是"插入"。无论如何,不​​,你不能,至少不是这样,因为obj.0是无效的语法。

  

但是我想在使用它时创建它:obj [' 0'] [' type'] =" Type0&#34 ;;

没关系。但您需要了解自己覆盖 obj[0][type]的现有值,这是一个空对象({}),字符串为Type0。换句话说,不需要为诸如type之类的属性提供初始化值以便为其分配。所以以下内容同样有效:

obj = {
  0:{},
  1:{},
  2:{}
};

现在让我们考虑你的第二个案例:

var obj = {};
obj.test = "test"; //One "layer" works fine.
obj.test.test = "test" //Two "layers" do not work... why?

仔细思考发生了什么。您正在创建一个空的obj。您可以分配该对象上的任何属性,而无需初始化该属性。这就是obj.test作业的原因。然后在第二个作业中,您尝试设置test的{​​{1}}属性,您将其设置为字符串obj.test。实际上,这将起作用 - 因为字符串是可以设置属性的对象。但那可能不是你想要做的。您可能想要说明前一个字符串值"test"将由具有自己的属性obj.test的对象替换。要做到这一点,你可以说

"test"

或者

obj.test = { test: "test" };

答案 1 :(得分:0)

您正在JavaScript中创建一个普通对象,您需要在使用它之前定义任何内部属性。

因此,如果您要在对象"Type0"的属性type内设置0属性obj,则不能

obj['0']['type'] = "Type0";

您收到“参考错误”。您需要在使用之前初始化对象:

var obj = {
  0: {
    type: ""
  }
};

obj['0']['type'] = "Type0";

console.log(obj['0']['type']);

答案 2 :(得分:0)

您可以创建自己的函数,将key作为字符串和value并创建并返回嵌套对象。我使用.作为对象键的分隔符。

function create(key, value) {
  var obj = {};
  var ar = key.split('.');

  ar.reduce(function(a, b, i) {
    return (i != (ar.length - 1)) ? a[b] = {} : a[b] = value
  }, obj)

  return obj;
}

console.log(create('0.type', 'type0'))
console.log(create('lorem.ipsum.123', 'someValue'))

答案 3 :(得分:0)

  

是否有必要在使用之前创建嵌套对象?

,至少父对象必须存在。

示例:

var object = {};

// need to assign object[0]['prop'] = 42;

使用默认

创建第一个属性
object[0] = object[0] || {};

然后分配值

object[0]['prop'] = 42;



var object = {};

object[0] = object[0] || {};
object[0]['prop'] = 42;

console.log(object);




使用属性名称作为数组创建对象



function setValue(object, keys, value) {
    var last = keys.pop();
    keys.reduce(function (o, k) {
        return o[k] = o[k] || {};
    }, object)[last] = value;
}

var object = {};

setValue(object, [0, 'prop'], 42);
console.log(object);