【问题标题】:How to parse (infinite) nested object notation?如何解析(无限)嵌套对象表示法?
【发布时间】:2012-11-19 15:20:05
【问题描述】:

我目前正在对转换此对象哈希感到头疼:

"food": {
    "healthy": {
        "fruits": ['apples', 'bananas', 'oranges'],
        "vegetables": ['salad', 'onions']
    },
    "unhealthy": {
        "fastFood": ['burgers', 'chicken', 'pizza']
    }
}

到这样的事情:

food:healthy:fruits:apples
food:healthy:fruits:bananas
food:healthy:fruits:oranges
food:healthy:vegetables:salad
food:healthy:vegetables:onions
food:unhealthy:fastFood:burgers
food:unhealthy:fastFood:chicken
food:unhealthy:fastFood:pizza

理论上它实际上只是在跟踪路径和最终结果的同时循环遍历对象。

不幸的是,在我完成所有嵌套之前,我不知道如何循环下去。

var path;
var pointer;
function loop(obj) {
    for (var propertyName in obj) {
        path = propertyName;
        pointer = obj[propertyName];

        if (pointer typeof === 'object') {
            loop(pointer);
        } else {
            break;
        }        
    }
};

function parse(object) {
    var collection = [];

};

各有两个问题:

  1. 如果我使用递归编程,它会丢失已解析的属性的状态。
  2. 如果我不使用它,我将无法解析无穷大。

有没有办法处理这个问题?

问候

【问题讨论】:

  • 在递归调用中向前传递状态。
  • @user1689607 你能举个例子吗?当它再次开始重新循环根属性时,它不会崩溃吗?

标签: javascript parsing object for-loop infinite-loop


【解决方案1】:

您的递归函数不起作用的原因是您将状态存储在它之外。您希望状态它内部,以便每次调用都跟踪其状态。

类似这样的:

var obj = /* ... the object ... */;
var lines = loop([], "", obj);

function loop(lines, prefix, obj) {
    var key, sawOne = false;

    // Is it an array?
    if (Object.prototype.toString.call(obj) === "[object Array]") {
        // Yes, in your example these are all just strings to put
        // at the end, so do that
        for (key = 0; key < obj.length; ++key) {
             lines.push(prefix + ":" + obj[key]);
        }
    }
    else {
        // No, it's an object. Recurse for each property, adding the
        // property to the prefix we use on each line
        for (key in obj) {
            loop(lines, prefix ? (prefix + ":" + key) : key, obj[key]);
        }
    }

    return lines;
}

完全即开即用且未经测试,但您明白了。

编辑:但显然它是有效的,因为 Michael Jasper 非常友好地制作了一个 live demo (source),我稍微调整了一下。

【讨论】:

    猜你喜欢
    • 2021-02-15
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多