2013-04-04 86 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

相關問題