3

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

"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. 如果我不使用它,我将无法解析无限。

有什么想法如何处理吗?

问候

4

1 回答 1

2

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

像这样的东西:

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非常友好地制作了一个现场演示),我稍微调整了它。

于 2012-12-01T17:08:15.807 回答