2015-09-16 14 views
6

Tôi đã một mảng của các đối tượng với các định dạng sauTạo một mảng kết hợp trong Javascript sử dụng chức năng bản đồ

[{'list': 'one', 'item': 1}, 
{'list': 'one', 'item': 2}, 
{'list': 'one', 'item': 3}, 
{'list': 'two', 'item': 1}, 
{'list': 'two', 'item': 2}] 

Và tôi muốn biến nó như thế này

[{'one': [1, 2, 3]}, 
{'two': [1, 2]}] 

Làm thế nào tôi có thể làm điều đó sử dụng hàm Array.map? Đó là giải pháp thay thế tốt nhất?

Trả lời

1

Đối với câu hỏi cụ thể của bạn:

// Let x hold your array of objects. 

res={}; // Create an empty object that will hold the answer 

x.forEach (function (e) { // Use this function to iterate over each item in the list 
    res[e.list] = res[e.list] || []; // inspired by the Nina Scholz answer below 
    res[e.list].push(e.item); // Append the result to the array 
}); 
+1

Bạn nên chấp nhận Nina Scholz trả lời dưới đây. Đó là thanh lịch, không biến đổi một biến kết quả, và cung cấp 'giảm', đó là cũng có giá trị học tập về. Nó sẽ có ích khi/nếu bạn chọn lập trình chức năng. –

1

Điều bạn đang tìm kiếm là phương pháp theo nhóm. Câu hỏi này có một câu trả lời tốt đẹp: https://codereview.stackexchange.com/questions/37028/grouping-elements-in-array-by-multiple-properties

Mã:

function groupBy(array , f) 
{ 
    var groups = {}; 
    array.forEach(function(o) 
    { 
    var group = JSON.stringify(f(o)); 
    groups[group] = groups[group] || []; 
    groups[group].push(o); 
    }); 
    return Object.keys(groups).map(function(group) 
    { 
    return groups[group]; 
    }) 
} 

var result = groupBy(list, function(item) 
{ 
    return [item.lastname, item.age]; 
}); 
8

Bạn có thể sử dụng Array.prototype.reduce cho nhiệm vụ của mình. Nó cho phép một giá trị trả về trong hàm gọi lại cho cuộc gọi tiếp theo.

var data = [ 
 
     { 'list': 'one', 'item': 1 }, 
 
     { 'list': 'one', 'item': 2 }, 
 
     { 'list': 'one', 'item': 3 }, 
 
     { 'list': 'two', 'item': 1 }, 
 
     { 'list': 'two', 'item': 2 } 
 
    ], 
 
    flat = data.reduce(function (r, a) { 
 
     r[a.list] = r[a.list] || []; 
 
     r[a.list].push(a.item); 
 
     return r; 
 
    }, {}); 
 

 
document.write('<pre>' + JSON.stringify(flat, 0, 4) + '</pre>');

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