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 = [];

};

それぞれを実行する 2 つの問題があります。

  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が親切にもライブ デモ( source ) を作成してくれたので、どうやら機能しているようです。

于 2012-12-01T17:08:15.807 に答える