2016-08-03 26 views
6

Ben tek bir nesne yaratılması gibi bu kodu yeniden yazmak için bir yol varsa anlamaya çalışıyorum nesneyi oluşturun: Ben yapmak istiyorum neforEach

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

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

bir şey gibi:

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

const my_obj = ...? 

forEach numaralı aramaya eşdeğer bir tek çekim dönüşümü yapmanın bir yolu var mı?

+0

Bunun yerine bir “Harita” kullanabilirsiniz (kafamın içinde çalışacak bir tek linerim var). – gcampbell

+2

"İndirme" yi anlatıyorsunuz. – ssube

+1

kullanımı lke'yi küçültmek bu 'my_obj = my_array.reduce ((a, b) => {a [b.key] = b.değer; a;;;, {}) –

cevap

7

Sen Array.prototype.reduce() kullanarak bunu başarabilirsiniz:

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"}


Alternatif ES6 sözdizimi kullanılarak:

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

Süper yalın istiyorsanız, muhtemelen uzaklaşabilirsiniz. ile (önceki, curr) => (önceki [curr.key] = curr.value, prev) ' – JDB

+0

@JDB: Bu durumda, muhtemelen tercih ederim (prev, curr) => Object.assign (prev , {[curr.key]: curr.value}) 've' (prev, curr) => {... prev, [curr.key]: curr.value} 'nesne yayılan operatörü destekleniyorsa. Benim düşüncemde daha okunaklı. – Timo

1

Sen reduce işlevini kullanabilirsiniz. Şöyle çalışması gerekir:

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

ES6 olarak, Object.assign kullanabilirsiniz:

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

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

Bu, her { key: foo, value: bar }{ foo: bar }, ardından onları birleştirmek için Object.assign kullanır dönüştürür bir nesne (spread operator, Object.assign değişkenlerin bir değişken listesini beklediği için kullanılır.)