将单个json拆分为单独的列表

时间:2016-02-26 09:59:05

标签: javascript json recursion

我有以下嵌套的json列表。 我实现了loopJson,但它不是递归的,并且它没有传递第一个对象列表。如果有人可以建议应该进行递归调用的位置以便执行递归,那将会很棒。

{
"key": "math",
"right": {
    "key": "Math"
},
"left": {
    "key": "A Greek–English Lexicon",
    "right": {
        "key": "A-list"
    },
    "left": {
        "key": "ASCII"
    }
}
}

      var loopJson = function(json){

      if(json.left.key != null){
          that.arrayTest.push({key:json.key,left:json.left.key});
      }
      if(json.right.key != null){
          that.arrayTest.push({key:json.key,right:json.right.key});
      }
  }

目标: 遍历每个对象并创建一个对象数组,包括带有键的对象("键","右")或("键","左&#34)。由于当前json是嵌套的,我想将json拆分为一个对象数组。但是,它不是遍历每个对象,因为它不是递归的。我必须找到一种让它递归的方法。

预期输出的一个例子:

[{key:"math",right:"Math"},{key:"math",left: "A Greek–English Lexicon"},{key: "A Greek–English Lexicon",left:""ASCII},{key: "A Greek–English Lexicon",right:"A-list"}]

2 个答案:

答案 0 :(得分:1)



var input = {
    "key": "math",
    "right": {
        "key": "Math"
    },
    "left": {
        "key": "A Greek–English Lexicon",
        "right": {
            "key": "A-list"
        },
        "left": {
            "key": "ASCII"
        }
    }
};

var nestedMethod = function(input) {
  var output = [];
  
  if (input.right) {
    output.push({ key: input.key, right: input.right.key });
    output = output.concat(nestedMethod(input.right));
  }
    
  if (input.left) {
    output.push({ key: input.key, left: input.left.key });
    output = output.concat(nestedMethod(input.left));
  }
  
  return output;
}

document.write(JSON.stringify(nestedMethod(input)));




答案 1 :(得分:1)

这是一个具有递归函数和固定属性数组的提案,以便照顾。

var object = {
        "key": "math",
        "right": {
            "key": "Math"
        },
        "left": {
            "key": "A Greek–English Lexicon",
            "right": {
                "key": "A-list"
            },
            "left": {
                "key": "ASCII"
            }
        }
    },
    array = [];

function getParts(object, array) {
    ['right', 'left'].forEach(function (k) {
        var o;
        if (object[k]) {
            o = { key: object.key };
            o[k] = object[k].key;
            array.push(o);
            getParts(object[k], array);
        }
    });
}

getParts(object, array);
document.write('<pre>' + JSON.stringify(array, 0, 4) + '</pre>');