2013-04-04 53 views
7

我有这个数组:简单的方法来压扁这个数组?

[{name: 'email',value: '[email protected]'}, {name: 'phone',value: '123-123-1234'}] 

我需要把它变成这样:

{email: '[email protected]', phone: '123-123-1234'} 

我怎样才能做到这一点?我想我可以做一百万个迭代器来完成这项工作,但我认为也许有更简单的方法来完成这项工作。

我使用Underscore和jQuery,如果有帮助。

+1

你必须interate这种或那种方式,因为你翻动数组的对象。 '$ .map'可以将对象转换为数组,而不是相反。 – Blazemonger 2013-04-04 17:09:35

回答

1

有几种方法可以完成这项任务。

一种是使用Array.prototype.map

var arr = [{name: 'email',value: '[email protected]'}, {name: 'phone',value: '123-123-1234'}]; 
var obj = {}; 
arr.map(function (item) { 
    var key = item.name; 
    var value = item.value; 
    if (!obj[key]) { 
     obj[key] = value; 
    } 
}); 
console.log(obj); 

作为评价和对方的回答指出,.reduce().forEach()或一个简单的for循环可以把工作和任务。

+0

http://jsfiddle.net/NcaqY/有样品小提琴,看起来很清楚 – kabuto178 2013-04-04 17:16:42

+0

这不是唯一的方法,你可以使用'Array.prototype.reduce' – axelduch 2015-12-24 16:10:02

+0

减少比地图和地图的使用更好答案没有意义。它被视为每个循环。 (是的,我知道这是一个2+岁以上的问题/答案) – epascarello 2015-12-24 16:47:31

0

UnderscoreJS太棒了,您可以使用_.map。请参见下面的代码:

var existingObject = [{name: 'email',value: '[email protected]'}, {name: 'phone',value: '123-123-1234'}]; 
var selectedObject = _.map(existingObject, function(obj) { 
    var retObj = { }; 
    retObj[obj["name"]] = obj["value"]; 
    return retObj; 
}); 

console.log(selectedObject); 
3

Array.prototype.reduce是这类操作的漂亮整洁:

var items = [{name: 'email',value: '[email protected]'}, {name: 'phone',value: '123-123-1234'}] 

var data = items.reduce(function (result, item) { 
    result[item.name] = item.value; 

    return result; 
}, {}); 
+0

我认为这是解决这个问题的最优雅和最简单的方法。 – 2015-12-24 21:48:21

相关问题