尝试在Javascript

时间:2016-04-21 04:26:37

标签: javascript json dynamic

我在操作和编写JSON对象等方面相当新,我有这个任务是根据用户输入动态创建JSON对象。我已设法在1级创建对象,但我想在对象中嵌套对象,这是所需的输出

// desired output

masterObj = [
  {
    "Market1": {
      "Size1": {
        "id": 1,
        "reporting_label": "a",
        ...
      },
      "Size2": {
        "id": 2,
        "reporting_label": "a",
        ...
      },
      "Size3": {
        "id": 3,
        "reporting_label": "a",
        ...
      },
      "Size4": {
        "id": 4,
        "reporting_label": "a",
        ...
      },
      "Size5": {
        "id": 5,
        "reporting_label": "a",
        ...
      }
    },
    "Market2": {...},
    "Market3": {...},
    "Market4": {...}

  }
]

我正在尝试在我的masterObj上使用push函数,然后在for循环中将所需对象推送到每个市场的masterObj的子节点。但我所能得到的就是将所有物体放在同一水平面上(即9个物体),现在开始绕圈子试图解决这个问题...

var masterObj = [{

}];

var requested = [
  { 
    "Markets": {
      // boolean values defined by checkboxes
      "Market1": show_m1, "Market2": show_m2, "Market3": show_m3, "Market4": show_m4
      },
    "Sizes": {
      // boolean values defined by checkboxes
      "Size1": show_s1, "Size2": show_s2, "Size3": show_s3, "Size4": show_s4, "Size5": show_s5
    }
  }
]

for (var item of requested) {

  if(item.Markets.Market1 === true ) {
    var m1Obj = {Market1: {}}
    masterObj.push(m1Obj);

    if(item.Sizes.Size1 === true) {
      var s1Obj = {
        Size1: {}
      }
      masterObj.push(s1Obj);
    }
    if(item.Sizes.Size2 === true) {
      var s2Obj = {
        Size2: {}
      }
      sgObj.push(s2Obj);
    }
    if(item.Sizes.Size3 === true) {
      var s3Obj = {
        Size3: {}
      }
      sgObj.push(s3Obj);
    }
    if(item.Sizes.Size4 === true) {
      var s4Obj = {
        Size4: {}
      }
      masterObj.push(s4Obj);
    }
    if(item.Sizes.Size5 === true) {
      var s5Obj = {
        Size5: {}
      }
      masterObj.push(s5Obj);
    }
  }

  if(item.Markets.Market2 === true ) {
    var m2Obj = {
      Market2: {}
    }
    // ouput each requested size
    masterObj.push(m2Obj);
  }
  if(item.Markets.Market3 === true ) {
    var m3Obj = {
      Market3: {}
    }
    // ouput each requested size
    masterObj.push(m3Obj);
  }
  if(item.Markets.Market4 === true ) {
    var m4Obj = {
      Market4: {}
    }
    // ouput each requested size
    masterObj.push(m4Obj);
  }
}

console.log(masterObj);

任何有关这方面的帮助都会令人惊讶,在我的脑海里,我相信我接近解决方案,但此刻它却在逃避我!

2 个答案:

答案 0 :(得分:0)

推送不起作用,因为你的对象有一个元素的数组..这是一个object而不是array

masterObj = [ { ... } ]

你很可能意味着拥有这种结构:

masterObj =   {
    "Market1": {
      "Size1": {
        "id": 1,
        "reporting_label": "a",
        ...
      },
      "Size2": {
        "id": 2,
        "reporting_label": "a",
        ...
      },
      "Size3": {
        "id": 3,
        "reporting_label": "a",
        ...
      },
      "Size4": {
        "id": 4,
        "reporting_label": "a",
        ...
      },
      "Size5": {
        "id": 5,
        "reporting_label": "a",
        ...
      }
    },
    "Market2": {...},
    "Market3": {...},
    "Market4": {...}

  }

然后您可以使用

进行访问
masterObj.Market7 = {...};

或者,如果您需要通过变量访问:

key = 'Market7';
masterObj[key] = {...};

编辑:注意:JSONS与此问题无关。您正在处理直接对象和数组。 JSON仅在将此对象序列化/反序列化为字符串时适用 - 通常用于存储或传输。

答案 1 :(得分:0)

通过一些重组,这是我最终得到的代码,我现在得到了我需要的东西。

感谢杰里米指出我正确的方向。

var requestedMarkets = [
  {market: "Market1", display: show_m1, name: "m1"},
  {market: "Market2", display: show_m2, name: "m2"},
  {market: "Market3", display: show_m3, name: "m3"},
  {market: "Market4", display: show_m4, name: "m4"}
];
var requestedSizes = [
  {display: show_s1, size: '100x200', name: "S1"},
  {display: show_s2, size: '100x300', name: "S2"},
  {display: show_s3,   size: '100x400',  name: "S3"},
  {display: show_s4, size: '100x500',  name: "S4"},
  {display: show_s5, size: '100x600', name: "S5"}
];

for (let item of requestedMarkets) {

  if(item.display === true ) {
    masterObj[item.market] = {};

    for (let size of requestedSizes) {

      var settings = {
        id: uniqueID,
        ...
      }

      if(size.display === true) {
        masterObj[item.market][size.name] = settings;
      }

    }

  }
}

console.log(masterObj);