2013-04-04 17 views
7

Ho questa matrice:Un modo semplice per appiattire questo array?

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

ho bisogno di trasformarlo in questo:

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

Come posso fare questo? Immagino di poter fare un milione di iteratori per portare a termine il lavoro, ma penso che forse c'è un modo più pulito per farlo.

Sto usando Underscore e jQuery se questo aiuta.

+1

Dovrete interate un modo o nell'altro, in quanto si sta trasformando un array in un oggetto. '$ .map' può convertire oggetti in matrici, ma non viceversa. – Blazemonger

risposta

1

Esistono diversi modi per eseguire questa operazione.

Uno sta usando 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); 

Come notato nei commenti e altra risposta, .reduce(), .forEach() o un semplice ciclo for può ottenere il lavoro fatto pure.

+0

http://jsfiddle.net/NcaqY/ C'è il campione di violino, sembra chiaro – kabuto178

+0

Questo non è l'unico modo, è possibile utilizzare 'Array.prototype.reduce' – axelduch

+0

ridurre è meglio della mappa e l'uso della mappa in questo la risposta non ha senso Viene trattato come ogni loop. (E sì, so che questa è una domanda/risposta di almeno 2 anni) – epascarello

0

UnderscoreJS è semplicemente fantastico, e si può usare _.map. Vedere il codice qui sotto:

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 è abbastanza carino per questo tipo di manipolazione:

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

Penso che questo sia il modo più elegante e semplice per risolvere questo problema. –

Problemi correlati