2016-08-03 19 views
6

Tôi đang cố gắng để tìm ra nếu có một cách để viết lại đoạn mã này như một đối tượng sáng tạo duy nhất:Tạo đối tượng từ foreach

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

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

Những gì tôi muốn làm là một cái gì đó như:

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

const my_obj = ...? 

Có cách nào để thực hiện chuyển đổi một lần tương đương với cuộc gọi forEach không?

+0

Bạn có thể sử dụng 'Bản đồ' thay thế (tôi có một lớp lót trong đầu sẽ hoạt động). – gcampbell

+2

Bạn đang mô tả 'reduce'. – ssube

+1

sử dụng giảm lke này 'my_obj = my_array.reduce ((a, b) => {a [b.key] = b.value; trả về a;}, {})' –

Trả lời

7

Bạn có thể đạt được điều này bằng 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"}


Ngoài ra, sử dụng cú pháp ES6:

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

Nếu bạn muốn nó siêu nạc, bạn có thể có thể lấy đi với '(prev, curr) => (prev [curr.key] = curr.value, prev)' – JDB

+0

@JDB: Trong trường hợp này, tôi có lẽ sẽ thích '(prev, curr) => Object.assign (prev , {[curr.key]: curr.value}) ', và' (prev, curr) => {... prev, [curr.key]: curr.value} 'nếu toán tử spread object được hỗ trợ. Dễ đọc hơn trong quan điểm của tôi. – Timo

1

Bạn có thể sử dụng chức năng reduce. Nó sẽ làm việc như thế này:

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

Trong ES6, bạn có thể sử dụng 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 }))); 

này chuyển mỗi { key: foo, value: bar }-{ foo: bar }, sau đó sử dụng Object.assign để ghép lại thành một đối tượng. (spread operator được sử dụng như Object.assign mong đợi một danh sách các biến đối số.)

Các vấn đề liên quan