2

このタイプのパターンに従うAPI(変更できない)からオブジェクトが送信されています:

{
  aaa: {
    name: "Aaa",
    desc: "..."
  },
  bbb: {
    name: "Bbb",
    desc: "..."
  },
  ccc: {
    name: "Ccc",
    desc: "...",
    stuff: {
      foo: {
        bar: "bar"
      },
      keys: ["foo"]
    }
  },
  keys: ["aaa", "bbb", "ccc"]
}

私がやろうとしているのは、これらのオブジェクトをクライアント上でより使いやすいオブジェクトに「フラット化」することです。したがって、上記のオブジェクトを平坦化した結果は次のようになります。

[
  {
    key: "aaa",
    name: "Aaa",
    desc: "..."
  },
  {
    key: "bbb",
    name: "Bbb",
    desc: "..."
  },
  {
    key: "ccc",
    name: "Ccc",
    stuff: [
      { key: "foo", bar: "bar" }
    ]    
  }
]

ご覧のとおり、トラバースする必要のあるデータには2つのレベルがあります。現在、ループして新しいオブジェクトを作成しています(以下の簡単な例)。これを処理するためのよりエレガントな方法があるかどうか疑問に思っていますか?

var myObjs = [];

$(data.keys).each(function(i, objKey) {
  i = $.extend({}, data[objKey], { key: objKey });
  myObjs.push(i);
});
4

2 に答える 2

1

これはそれを行う必要があります:

function toArray(obj) {
    if (typeof obj !== 'object' || !("keys" in obj))
        return obj;
    return obj.keys.map(function(key) {
        var sub = obj[key];
        if (typeof sub !== 'object')
            return sub;
        for (var prop in sub)
            sub[prop] = toArray(sub[prop]);
        sub.key = key;
        return sub;
    });
}
于 2013-02-27T17:22:30.533 に答える
1

これはあなたが必要とすることをするようです:

function flatten(obj) {
    return $.map(obj.keys, function(key) {
        var res = $.extend({}, obj[key], {key: key});
        for (var key in res) {
            if (typeof res[key] === 'object') {
                res[key] = flatten(res[key]);
            }
        }
        return res;
    });
}

http://jsfiddle.net/alnitak/pgq2S/を参照してください。

注意: オブジェクトをネストしている限り、これは再帰を続けます。現在、2 レベルで停止することはありません。

于 2013-02-27T17:22:45.663 に答える