2017-06-08 6 views
0

Wie würde ich eine Aufgabe erreichen, ein Array von Arrays von Arrays mithilfe von JavaScript in ein Array von Objekten umzuwandeln? Z.B.Ein Array in ein Objekt transformieren

[ 
    [ 
      [a,b],[c,d],[e,f] 
    ], 
    [ 
      [g,h],[i,j],[k,l] 
    ] 
] 

--->

[ 
    {a:b, c:d, e:f}, {g:h, i:j, k:l} 
] 
+1

mich akzeptiert Ich würde vorschlagen, 'Array.prototype.reduce' als Ausgangspunkt zu betrachten. – fubar

+0

Ich würde ein Objekt mit einigen Variablen machen, die die Art von Arrays sind, die Sie brauchen. Kopieren Sie dann das Objekt in ein Array. – holycatcrusher

+1

Sie wissen, dass ['a', 'b'] zwei Werte sind: [0] = 'a' und [1] = 'b' und {'a': 'b'} ist das 'a' = ' hell? –

Antwort

2

Funktionsdatentransformation mit map und reduce

kann mapreduce und verwendet, um die gewünschte Datenform

const data = [ 
 
    [ ['a', 1], ['b', 2], ['c', 3] ], 
 
    [ ['d', 4], ['e', 5], ['f', 6] ] 
 
] 
 

 
const data2 = data.map(pairs => 
 
    pairs.reduce((obj, [k,v]) => 
 
    Object.assign(obj, { [k]: v }), {})) 
 
    
 
console.log(data2) 
 
// [ { a: 1, b: 2, c: 3 }, { d: 4, e: 5, f: 6 } ]

zu erreichen

generische Funktionen

Die obige Transformation kognitiv dicht ist und kann in zwei hilfreiche Funktionen zerlegt werden - diese beiden Funktionen mapReducer und pair2obj sind allgemein genug, dass wir sie leicht in andere Teile unseres Programms wiederverwenden können

const mapReducer = (f, g) => 
 
    (acc, x) => f (acc, g (x)) 
 

 
const pair2obj = ([x, y]) => 
 
    ({ [x]: y }) 
 

 
const data = [ 
 
    [ ['a', 1], ['b', 2], ['c', 3] ], 
 
    [ ['d', 4], ['e', 5], ['f', 6] ] 
 
] 
 

 
const data2 = data.map (pairs => 
 
    pairs.reduce(mapReducer(Object.assign, pair2obj), {})) 
 

 
console.log(data2) 
 
// [ { a: 1, b: 2, c: 3 }, { d: 4, e: 5, f: 6 } ]


nativen Map

Wenn Sie Map Objekte in Ihrem Programm verwenden können, ist dies wahrscheinlich besser, weil Ihre Daten bereits in dem Format, das der Map Konstruktor

const data = [ 
 
    [ 
 
    ['a',1],['b',2],['c',3] 
 
    ], 
 
    [ 
 
    ['d',4],['e',5],['f',6] 
 
    ] 
 
] 
 

 
const data2 = data.map(pairs => new Map(pairs)) 
 

 
console.log(data2[0].get('a')) // 1 
 
console.log(data2[0].get('b')) // 2 
 
console.log(data2[0].get('c')) // 3 
 
console.log(data2[1].get('d')) // 4 
 
console.log(data2[1].get('e')) // 5 
 
console.log(data2[1].get('f')) // 6

+0

Schön. Ich habe nicht darüber nachgedacht, die Paare in der Funktionsdefinition zu erweitern. – fubar

+0

@fubar Destrukturierung kann in vielen Fällen wirklich mit der Lesbarkeit helfen^_ ^ – naomik

0

Ich war fasziniert, dachte so würde ich einen Riss haben.

Ich machte die Annahme, dass die key Werte immer zulässige Objektschlüsselwerte wären.

var data = [ 
    [ 
    ['a','b'],['c','d'],['e','f'] 
    ], 
    [ 
    ['g','h'],['i','j'],['k','l'] 
    ] 
]; 

// ES5 
data = data.map(function (d) { 
    return d.reduce(function (o, v) { 
    o[v[0]] = v[1];  
    return o; 
    }, {}); 
}); 

// ES6 
data = data.map((d) => d.reduce((o, v) => { 
    o[v[0]] = v[1];  
    return o; 
}, {})); 

console.log(data); 
Verwandte Themen