2015-10-14 6 views
7

Ho bisogno di convertire la matrice di oggetti in oggetto. Ho fatto con la logica sottostante. C'è un modo migliore per gestire questo?Il modo migliore per convertire la matrice di oggetti in Object?

Fiddler Version

var before = [{ 
 
    "x": ["2015-10-14T01:59:59.999+05:30", "2015-10-14T03:59:59.998+05:30", "2015-10-14T05:59:59.997+05:30", "2015-10-14T07:59:59.996+05:30", "2015-10-14T09:59:59.995+05:30", "2015-10-14T11:59:59.994+05:30", "2015-10-14T13:59:59.993+05:30", "2015-10-14T15:59:59.992+05:30", "2015-10-14T17:59:59.991+05:30", "2015-10-14T19:59:59.990+05:30", "2015-10-14T21:59:59.989+05:30", "2015-10-14T23:59:59.988+05:30"] 
 
}, { 
 
    "CleanCoal": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}, { 
 
    "Middelings": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}, { 
 
    "Prime": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}, { 
 
    "SpiralProd": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}]; 
 

 
var after = {}; 
 

 
for (var i = 0; i < before.length; i++) { 
 
    var keys = Object.keys(before[i]); 
 

 
    after[keys] = before[i][keys]; 
 
} 
 

 
console.log(after) 
 
document.writeln(JSON.stringify(after))

+0

la versione non è vero, se '{a: 1, B: 4, ....}' oggetto di la chiave sarà più di una. –

+0

L'approccio funziona solo perché gli array interni hanno ciascuno una sola chiave. Con più di uno fallirebbe. Hai bisogno di un secondo ciclo. – Yoshi

risposta

6

È possibile utilizzare forEach per iterare su un array, e si è dimenticato di iterare l'array nidificato se ci sono più elementi all'interno di un oggetto.

Quindi, il codice in questione non funzionerà per

var arr = [{'a': 'b', 'c': 'd'}]; 

Demo

var before = [{ 
 
    "x": ["2015-10-14T01:59:59.999+05:30", "2015-10-14T03:59:59.998+05:30", "2015-10-14T05:59:59.997+05:30", "2015-10-14T07:59:59.996+05:30", "2015-10-14T09:59:59.995+05:30", "2015-10-14T11:59:59.994+05:30", "2015-10-14T13:59:59.993+05:30", "2015-10-14T15:59:59.992+05:30", "2015-10-14T17:59:59.991+05:30", "2015-10-14T19:59:59.990+05:30", "2015-10-14T21:59:59.989+05:30", "2015-10-14T23:59:59.988+05:30"] 
 
}, { 
 
    "CleanCoal": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}, { 
 
    "Middelings": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}, { 
 
    "Prime": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}, { 
 
    "SpiralProd": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}]; 
 

 
var after = {}; 
 

 
before.forEach(function(obj) { 
 
    // obj here is the element of the array, i.e. object 
 

 
    // Looping over all the keys of the object 
 
    Object.keys(obj).forEach(function(key) { 
 
    // key here is the key of the object 
 
    after[key] = obj[key]; 
 
    }); 
 
}); 
 

 
console.log(after); 
 
document.writeln('<pre>' + JSON.stringify(after, 0, 2) + '</pre>');

+0

Grazie per la risposta. Devo anche cambiare il formato della data da stringa a data. Ho aggiornato lo snippet di codice. Quanto posso convertire in modo efficiente? –

+1

@PremkumarJayaseelan Si prega di fare una domanda diversa per cambiare il formato della data – Tushar

+0

Ciao, fratello, Grazie per 'JSON.stringify (after, 0, 2)'. Non lo sapevo Cosa ne pensi della mia risposta. Potete consigliarmi (è un buon modo o no)? –

3

Usiamo il meglio della programmazione funzionale in JavaScript:

Usando reduce non abbiamo bisogno di aggiungere variabili temporanee per l'ambito esterno.

for (var i in obj) è generalmente più veloce di Obj.keys(obj).forEach: https://jsperf.com/for-in-versus-object-keys-foreach

var before = [{ 
 
    "x": ["2015-10-14T01:59:59.999+05:30", "2015-10-14T03:59:59.998+05:30", "2015-10-14T05:59:59.997+05:30", "2015-10-14T07:59:59.996+05:30", "2015-10-14T09:59:59.995+05:30", "2015-10-14T11:59:59.994+05:30", "2015-10-14T13:59:59.993+05:30", "2015-10-14T15:59:59.992+05:30", "2015-10-14T17:59:59.991+05:30", "2015-10-14T19:59:59.990+05:30", "2015-10-14T21:59:59.989+05:30", "2015-10-14T23:59:59.988+05:30"] 
 
}, { 
 
    "CleanCoal": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}, { 
 
    "Middelings": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}, { 
 
    "Prime": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}, { 
 
    "SpiralProd": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}]; 
 
var after = before.reduce(function(dst, src){ 
 
    // import every key: val in src into dst 
 
    // and keep doing it for every element in the array. 
 
    for (var key in src) 
 
    if ({}.hasOwnProperty.call(src, key)) 
 
     dst[key] = src[key]; 
 
    return dst; 
 
}, {}); // start with an empty object to avoid modifying items in before array. 
 

 
document.writeln("<pre>" + JSON.stringify(after, null, 4) + "</pre>")

+0

Le risposte solo in codice non sono ottimali. Dovresti spiegare perché il tuo codice soddisfa i requisiti degli OP. – RobG

1

Come su Object.assign?

var before = [{ 
 
    "x": ["2015-10-14T01:59:59.999+05:30", "2015-10-14T03:59:59.998+05:30", "2015-10-14T05:59:59.997+05:30", "2015-10-14T07:59:59.996+05:30", "2015-10-14T09:59:59.995+05:30", "2015-10-14T11:59:59.994+05:30", "2015-10-14T13:59:59.993+05:30", "2015-10-14T15:59:59.992+05:30", "2015-10-14T17:59:59.991+05:30", "2015-10-14T19:59:59.990+05:30", "2015-10-14T21:59:59.989+05:30", "2015-10-14T23:59:59.988+05:30"] 
 
}, { 
 
    "CleanCoal": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}, { 
 
    "Middelings": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}, { 
 
    "Prime": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}, { 
 
    "SpiralProd": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"] 
 
}]; 
 

 
var after = {}; 
 

 
before.map(function(i){ 
 
    return Object.assign(after,i); 
 
}) 
 

 

 
console.log(after) 
 
document.writeln(JSON.stringify(after))

3

In browser più recenti [ECMAScript 5], abbiamo reduce che restituisce un oggetto

prova sotto

var before = [{"x":["2015-10-14T01:59:59.999+05:30","2015-10-14T03:59:59.998+05:30","2015-10-14T05:59:59.997+05:30","2015-10-14T07:59:59.996+05:30","2015-10-14T09:59:59.995+05:30","2015-10-14T11:59:59.994+05:30","2015-10-14T13:59:59.993+05:30","2015-10-14T15:59:59.992+05:30","2015-10-14T17:59:59.991+05:30","2015-10-14T19:59:59.990+05:30","2015-10-14T21:59:59.989+05:30","2015-10-14T23:59:59.988+05:30"]},{"CleanCoal":["0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00"]},{"Middelings":["0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00"]},{"Prime":["0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00"]},{"SpiralProd":["0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00"]}]; 
 

 

 
var object = before.reduce(function(o, v, i) { 
 
    o[i] = v; 
 
    return o; 
 
}, {}); 
 

 
console.log(object);

Fiddle qui http://jsfiddle.net/pscytrgj/

+1

* reduce * non restituisce necessariamente un oggetto, restituisce tutto ciò che la richiamata restituisce come accumulatore (che può essere qualsiasi valore). MDN fornisce un [polyfill per * reduce *] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce#Polyfill) in modo che anche i browser più vecchi siano sistemati. – RobG

+0

@RobG Sì, è vero! un po 'imparando anche per me :) Grazie! –

2

È possibile farlo attraverso JSON.stringify()

var before = [{ 
 
    "x": ["1", "2"], 
 
    y: { 
 
    a: 3 
 
    } 
 
}, { 
 
    "CleanCoal": ["0.00", "0.00"], 
 
    b: 4 
 
}, { 
 
    "Middelings": ["0.00", "0.00"] 
 
}, { 
 
    "Prime": ["0.00", "0.00", "0.00"] 
 
}, { 
 
    "SpiralProd": ["0.00", "0.00", "0.00"] 
 
}]; 
 

 
var after = {}; 
 
var b = "", 
 
    i = -1; 
 
while (before[++i]) { 
 
    var str = JSON.stringify(before[i]); 
 
    b += str.slice(1, str.length - 1); 
 
    if (before[i + 1]) b += ","; 
 
} 
 
after = JSON.parse("{" + b + "}"); 
 
console.log(after); 
 
document.write("<pre>" + JSON.stringify(after, 0, 3) + "</pre>")

Problemi correlati