2013-11-09 8 views

risposta

11

Probabilmente siete alla ricerca di qualcosa di simile:

// original 
var arr = [ 
    {key : '11', value : '1100', $$hashKey : '00X' }, 
    {key : '22', value : '2200', $$hashKey : '018' } 
]; 

//convert 
var result = {}; 
for (var i=0; i<arr.length; i++) { 
    result[arr[i].key] = arr[i].value; 
} 

//result 
console.log(result); 
0

Ecco qua:

var arr = [{ key: "11", value: "1100" }, { key: "22", value: "2200" }]; 
var result = {}; 
for (var i=0, len=arr.length; i < len; i++) { 
    result[arr[i].key] = arr[i].value; 
} 
console.log(result); // {11: "1000", 22: "2200"} 
+0

Questo assomiglia sorprendentemente alla risposta che qualcuno ha postato come 5 minuti fa – Alexander

+1

Perché è così che risolvi questo problema.A proposito della denominazione, ad esempio: 'array' è una parola chiave riservata, quindi le persone usano invece 'arr'. ecc. – pstadler

0

Ecco come accettare in modo dinamico quanto sopra come una stringa e interpolare in un oggetto:

var stringObject = '[Object { key="11", value="1100", $$hashKey="00X"}, Object { key="22", value="2200", $$hashKey="018"}]'; 

function interpolateStringObject(stringObject) { 
    var jsObj = {}; 
    var processedObj = stringObject.split("[Object { "); 
    processedObj = processedObj[1].split("},"); 
    $.each(processedObj, function (i, v) { 
     jsObj[v.split("key=")[1].split(",")[0]] = v.split("value=")[1].split(",")[0].replace(/\"/g,''); 
    }); 

    return jsObj 
} 

var t = interpolateStringObject(stringObject); //t is the object you want 

http://jsfiddle.net/3QKmX/1/

21

mi piace l'approccio funzionale per realizzare questo compito:

var arr = [{ key:"11", value:"1100" }, { key:"22", value:"2200" }]; 
var result = arr.reduce(function(obj,item){ 
    obj[item.key] = item.value; 
    return obj; 
}, {}); 

Nota : Ultimo {} è il valore obj iniziale per la funzione di riduzione, se non si fornisce il valore iniziale il primoVerrà utilizzato l'elemento(che probabilmente non è desiderabile).

https://jsfiddle.net/GreQ/2xa078da/

+1

e se la chiave è dinamica? –

+0

Bene, dovresti sapere quale proprietà dell'oggetto/oggetto dato dovrebbe essere usata come chiave e quale valore no? Ma se supponiamo che wfirst prop sia sempre la chiave e secondo il valore potremmo usare una funzione di callback come questa: function (obj, item) { \t \t var keys = item.keys(); oggetto [elemento [tasti [0]]] = elemento [tasti [0]]; return obj; } – GreQ

+0

Correzione di richiamata sopra: codice var obj = arr.reduce (funzione (obj, item) { \t \t tasti var = Object.keys (voce); \t \t obj [item [tasti [0]] ] = item [keys [1]]; return obj; }, {}); – GreQ

2

Utilizzando Underscore.js:

var myArray = [ 
    Object { key="11", value="1100", $$hashKey="00X"}, 
    Object { key="22", value="2200", $$hashKey="018"} 
]; 
var myObj = _.object(_.pluck(myArray, 'key'), _.pluck(myArray, 'value')); 
9

soluzione piccolo ES6 può assomigliare:

var arr = [{key:"11", value:"1100"},{key:"22", value:"2200"}]; 
var object = arr.reduce(
    (obj, item) => Object.assign(obj, {[item.key]: item.value}) ,{}); 

Inoltre, se si utilizza la diffusione oggetto, di quanto possa sembrare:

var object = arr.reduce((obj, item) => ({...obj, {[item.key]: item.value}}) ,{}); 

Un'altra soluzione che è il 99% più veloce è (testato su jsperf):

var object = arr.reduce((obj, item) => (obj[item.key] = item.value, obj) ,{}); 

Qui beneficiamo dell'operatore virgola, valuta tutte le espressioni prima della virgola e restituisce un ultimo (dopo l'ultima virgola). Quindi non copiamo obj ogni volta, piuttosto assegnandogli una nuova proprietà.

+1

La risposta più semplice di tutte, ma anche la più elegante –

30
var newObj = Object.assign({}, ...array) 

terminato!

+0

La "magia" si trasforma in 'Object.assign ({}, {chiave: '11 ', valore:' 1100 '}, {chiave: '22', valore: '2200'}) 'che risulta nell'oggetto:' {chiave: '22 ', valore:' 2200 '} ', non il risultato voluto. – Tibos

Problemi correlati