【问题标题】:Javascript Recursion for creating a JSON object用于创建 JSON 对象的 Javascript 递归
【发布时间】:2012-08-03 09:00:33
【问题描述】:

需要一些关于如何正确递归地执行此操作的建议。

基本上我正在做的是输入一堆文本并将其作为 JSON 返回。

例如:

正文:

q
b
name:rawr

返回:

[
  "q",
  "b",
  {
    "name": "rawr"
  }
]

还有以下输入:

q
b
name:rawr:awesome

会返回(输出格式不重要):

[
  "q",
  "b",
  {
    "name": {
        "rawr": "awesome"
    }
  }
]

如何修改以下代码以允许以递归方式在对象中包含对象。

var jsonify = function(input){
  var listItems = input, myArray = [], end = [], i, item;

  var items = listItems.split('\r\n');

  // Loop through all the items
  for(i = 0; i < items.length; i++){

    item = items[i].split(':');

    // If there is a value, then split it to create an object
    if(item[1] !== undefined){
      var obj = {};
      obj[item[0]] = item[1];  
      end.push(obj);
    }
    else{
      end.push(item[0]);
    }
  }

  // return the results
  return end;
};

【问题讨论】:

  • 您的 jsfiddle 毫无价值 - 它不包含该代码的演示应用程序。 jsfiddle 不是 stackoverflow 的 sn-p 托管程序,您需要在问题中发布相关代码。

标签: javascript


【解决方案1】:

我不认为递归是正确的方法,循环也可以做到这一点:

var itemparts = items[i].split(':');

var value = itemparts.pop();
while (itemparts.length) {
    var obj = {};
    obj[itemparts.pop()] = value;
    value = obj;
}
end.push(value);

当然,由于递归和循环具有等效的功能,因此您可以对递归函数执行相同的操作:

function recurse(parts) {
    if (parts.length == 1)
        return parts[0];
    // else
    var obj = {};
    obj[parts.shift()] = recurse(parts);
    return obj;
}
end.push(recurse(items[i].split(':')));

【讨论】:

  • 两者都可以,但我认为递归解决方案可能更具可读性。
  • 这让我想起了教科书上的一句话。 “每个递归问题都可以用循环来解决,但反之则不行。” +1 简单的解决方案
【解决方案2】:

这是一个递归解决方案:

var data = [];

function createJSON(input) {

    var rows = input.split("\n");
    for(var i = 0; i < rows.length; i++) {
        data.push(createObject(rows[i].split(":")));
        }

    }

function createObject(array) {
    if(array.length === 1) {
        return array[0];
        } else {
        var obj = {};
        obj[array[0]] = createObject(array.splice(1));
        return obj;
        }
    }

createJSON("p\nq\nname:rawr:awesome");
console.log(data);

【讨论】:

    猜你喜欢
    • 2019-09-03
    • 2016-05-26
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 2014-04-08
    • 2012-12-14
    相关资源
    最近更新 更多