解析密钥JSON对象的最佳方法

时间:2013-02-27 17:02:15

标签: javascript jquery json

我的对象是从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个级别的数据。 目前我正在循环并创建新对象(简要说明如下),我只是想知道是否有一种更优雅的方式来处理它?<​​/ p>

var myObjs = [];

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

2 个答案:

答案 0 :(得分: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;
    });
}

答案 1 :(得分: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/

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