Javascript 解析键控JSON对象的最佳方法
我从API(无法更改)向我发送的对象遵循以下类型的模式: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"] }
{
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;
});
}
看
注意:只要您有嵌套对象,它就会继续递归-它当前不会在两个级别停止。为什么需要这样做?在中,
是否不是一个选项?