我的对象是从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);
});
答案 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/
注意:只要您有嵌套对象,它就会继续递归 - 它目前不会停在两个级别。