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/

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

于 2013-02-27T17:22:45.663 回答