2016-08-03 11 views
6

Próbuję dowiedzieć się, czy istnieje sposób, aby przepisać ten kod jako pojedynczy tworzenia obiektów:Tworzenie obiektu z forEach

my_array = [ 
    {key: 1, value: "foo"}, 
    {key: 2, value: "bar"} 
]; 

let my_obj = {}; 
my_array.forEach((elem) => { 
    my_obj[elem.key] = elem.value; 
}); 

Co chciałbym zrobić coś takiego jak:

my_array = [ 
    {key: 1, value: "foo"}, 
    {key: 2, value: "bar"}, 
]; 

const my_obj = ...? 

Czy istnieje sposób wykonania jednokrotnej konwersji, która jest odpowiednikiem połączenia forEach?

+0

Zamiast tego możesz użyć 'Map' (mam w głowie jedną linijkę, która działałaby). – gcampbell

+2

Opisujesz 'redu'. – ssube

+1

use reduce lke to 'my_obj = my_array.reduce ((a, b) => {a [b.key] = b.value; return a;}, {})' –

Odpowiedz

7

Można to osiągnąć stosując Array.prototype.reduce():

var my_array = [{key: 1, value:"foo"}, {key: 2, value:"bar"}]; 
 
    
 
var my_object = my_array.reduce(function(prev, curr) { 
 
    prev[curr.key] = curr.value; 
 
    return prev; 
 
}, {}); 
 

 
console.log(my_object); // {"1": "foo", "2": "bar"}


Alternatywnie, używając składni ES6:

const my_object = my_array.reduce((prev, curr) => { 
    prev[curr.key] = curr.value; 
    return prev; 
}, {}); 
+0

Jeśli chcesz, żeby był super szczupły, prawdopodobnie mógłbyś uciec z '(prev, curr) => (prev [curr.key] = curr.value, prev)' – JDB

+0

@JDB: W tym przypadku prawdopodobnie wolałbym '(prev, curr) => Object.assign (prev , {[curr.key]: curr.value}) 'i' (prev, curr) => {... prev, [curr.key]: curr.value} 'jeśli operator rozprzestrzeniania obiektów jest obsługiwany. Bardziej czytelny według mnie. – Timo

1

Można użyć funkcji reduce. Powinno to działać tak:

my_array = [ 
 
    {key: 1, value: "foo"}, 
 
    {key: 2, value: "bar"} 
 
]; 
 

 
let my_obj = my_array.reduce(function(obj, elem) { 
 
    obj[elem.key] = elem.value; 
 
    return obj; 
 
}, {}); 
 

 
// my_obj = { "1": "foo", "2": "bar" }

1

W ES6, można użyć Object.assign:

const obj = Object.assign({}, ...my_array.map(x => ({ [x.key]: x.value }))); 

// Or: 
const obj = Object.assign({}, ...my_array.map(({ key, value }) => ({ [key]: value }))); 

To konwertuje każdy { key: foo, value: bar } do { foo: bar }, a następnie wykorzystuje Object.assign aby połączyć je w jeden obiekt. (spread operator jest używany jako Object.assign oczekuje zmiennej listy argumentów.)