转换/展开对象数组

3
我有一个对象数组,需要将其转换为一个对象。是否有简单的方法可以做到这一点?我在页面上使用了underscore,也许它能帮助解决问题。
[{John:{name:"John", age : 59}},{Dave:{name:"Dave", age:62}}]

为了

{John:{name:"John", age : 59}, Dave:{name:"Dave", age:62}}

我认为我可以递归遍历这个数组,并创建最终的对象,但希望有更简单/更好的方法。由于我是 JavaScript 新手,所以任何指针都会受到赞赏。

4个回答

9

既然你提到了有可用的 Underscore.js,那么你只需使用 extend 函数即可:

var arr = [{John:{name:"John", age : 59}},{Dave:{name:"Dave", age:62}}];

var flattened = _.extend.apply(_, arr);

http://jsfiddle.net/Yjmbk/


1
当那个方案真正奏效时,我内心不禁感叹一声“哦!”。这是一个聪明但有些奇怪的解决方案。+1 - Matt Fletcher

3
var arr = [{John:{name:"John", age : 59}},{Dave:{name:"Dave", age:62}}];

var obj = {};

for(var i = 0; i < arr.length; i++){
    for(x in arr[i]){
        obj[x] = arr[i][x];   
    }
}

http://jsfiddle.net/jp4wG/


谢谢,一旦可以,我会立即接受这个。非常感谢您的帮助。 - Chin
当数组的深度未知时,我们该如何处理呢?例如:[{John:{children:[{Dave:{children:[{Maggie:children.... - Luke T O'Brien

1
这应该能解决问题:
var names = [{John:{name:"John", age : 59}},{Dave:{name:"Dave", age:62}}];
var flattened = {};

for (var i = 0; i < names.length; i++) {
    for (var entry in names[i]) {
        flattened[entry] = names[i][entry];
    }
}

1

大多数JavaScript框架(Mootools,JQuery,可能是underscore)都将提供一些函数,使这更容易。如果您要展平的对象是自定义类,则必须注意在 for in 循环中出现的添加方法定义。

var nested = [{John:{name:"John", age : 59}},{Dave:{name:"Dave", age:62}}], flattened = {};

for(var i = 0; i < nested.length; i++) {
    for(key in nested[i]) {
         flattened[key] = nested[i][key];  
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接