Javascript 解析键控JSON对象的最佳方法

Javascript 解析键控JSON对象的最佳方法,javascript,jquery,json,Javascript,Jquery,Json,我从API(无法更改)向我发送的对象遵循以下类型的模式: { aaa: { name: "Aaa", desc: "..." }, bbb: { name: "Bbb", desc: "..." }, ccc: { name: "Ccc", desc: "...", stuff: { foo: { bar: "bar" }, keys: ["foo"] }

我从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" }
    ]    
  }
]
如您所见,我需要遍历两个级别的数据。 目前我正在循环并创建新对象(如下简称),我只是想知道是否有更优雅的方法来处理这个问题

var myObjs = [];

$(data.keys).each(function(i, objKey) {
  i = $.extend({}, data[objKey], { key: objKey });
  myObjs.push(i);
});
这应该做到:

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;
    });
}

这似乎满足了您的要求:

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;
    });
}


注意:只要您有嵌套对象,它就会继续递归-它当前不会在两个级别停止。

为什么需要这样做?在中,
是否不是一个选项?