从对象动态创建JSON数组

时间:2018-04-06 20:03:48

标签: javascript jquery json

我有一个对象A,如下所示。

var A = {
    "1": [ "1_1", "1_2", "1_3" ],
    "2": [ "2_1", "2_2" ]
};

需要使用js动态构建新数组。假设
对象键应该映射到数组AA的属性文本,值应该是子项,如下所示。

var AA = [
    {
        "text": "1",
        "state": "open",
        "children": [
            { "text": "1_1" }, 
            { "text": "1_2" }, 
            { "text": "1_3" }
        ]
    }, 
    {
        "text": "2",
        "state": "open",
        "children": [
            { "text": "2_1" }, 
            { "text": "2_2" }
        ]
    }
];

这是我的功能,但它没有按预期工作。有人可以帮忙吗?

function constructJSONArr() {
    var A = {
        "1": [ "1_1", "1_2", "1_3" ],
        "2": [ "2_1", "2_2" ]
    };

    for (var key in A) {
        var tempArr = [];
        tempArr.push(key);
        for (var i = 0; i < key.length; i++) {
            return {
                'text': key,
                'state': 'closed',
                'children': A[key].map(function(child) {
                    return {
                        'text': child
                    };
                })
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

当您返回函数内部时,函数结束并立即返回。在您的情况下,for循环内的return会导致函数返回第一个关键对象。要解决此问题,您需要创建对象并将它们推入arr。您可以在Array.map()内自由返回,因为每次迭代都会调用一个函数。

固定解决方案:

使用for...in进行迭代。获取key。将新对象推送到arr。使用key作为text属性,statechildren。要创建子项,请通过key从原始对象获取数组,并使用Array.map()生成子对象。返回arr

var A = {
  "1": ["1_1", "1_2", "1_3"],
  "2": ["2_1", "2_2"]
};

function constructJSONArr(A) {
  var arr = [];
  for (var key in A) {
    arr.push({
      text: key,
      state: 'closed',
      children: A[key].map(function(t) {
        return {
          text: t
        };
      })
    });
  }
  
  return arr;
}

var result = constructJSONArr(A);

console.log(result);

ESNext解决方案

使用Object.entries()从对象A获取密钥和相应值。使用两个嵌套Array.map()调用迭代条目。第一个创建外部对象,第二个创建子项。

const A = {
  "1": ["1_1", "1_2", "1_3"],
  "2": ["2_1", "2_2"]
};

const constructJSONArr = (obj) =>
  Object.entries(obj).map(([text, children]) => ({
    text,
    state: 'closed',
    children: children.map((text) => ({
      text
    }))
  }));

var result = constructJSONArr(A);

console.log(result);

答案 1 :(得分:0)

您可以使用Object.keys()遍历对象和Array.map来创建新数组。

var A = {
  "1": ["1_1", "1_2", "1_3"],
  "2": ["2_1", "2_2"]
};


var transformed = Object.keys(A).map(key => {
  return {
    text: key,
    state: "open",
    children: A[key].map(value => {
      return {
        text: value
      };
    })
  };
});

console.log(transformed);