尝试在Javascript中嵌套基于用户输入的动态生成的JSON

Trying to nest dynamically generated JSON based on user input in Javascript

本文关键字:输入 用户 动态 JSON Javascript 嵌套 于用户      更新时间:2023-09-26

我对操作和编写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上使用推送功能,然后在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);

任何帮助都将是惊人的,在我的脑海中,我相信我已经接近解决方案,但目前它正在回避我!

Push无法工作,因为您的对象有一个由一个元素组成的数组。。其为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仅在将此对象序列化/反序列化为字符串时适用——通常用于存储或传输

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

感谢Jeremy为我指明了正确的方向。

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