2013-06-06 71 views
6

Tôi đã chống lại vấn đề này trong nhiều ngữ cảnh và ngôn ngữ và tôi luôn có thể làm việc xung quanh nó nhưng tôi muốn tìm ra một mẫu phù hợp xử lý này. Nó xuất phát từ việc nối các bảng SQL. Thông thường tôi sẽ thực hiện hai cuộc gọi, một cho các mục và một cho ý kiến ​​nhưng tôi biết có một cách để có được tất cả trong một cuộc gọi và sau đó san bằng kết quả.Làm phẳng mảng đối tượng vào một mảng đối tượng khác bằng cách sử dụng javascript

Những gì tôi muốn làm là để có một mảng mà trông như thế này:

[ 
    { 
    itemId: 1, 
    comments: { 
     commentId: 1 
    } 
    }, 
    { 
    itemId: 1, 
    comments: { 
     commentId: 2 
    } 
    }, 
    { 
    itemId: 2, 
    comments: { 
     commentId: 3 
    } 
    } 
] 

Và biến nó thành này:

[ 
    { 
    itemId: 1, 
    comments: [ 
     { 
     commentId: 1 
     }, 
     { 
     commentId: 2 
     } 
    ] 
    }, 
    { 
    itemId: 2, 
    comments: [ 
     { 
     commentId: 3 
     } 
    ] 
    } 
] 
+0

whathaveyoutried dot com – akonsu

Trả lời

1

Sau đây nên làm việc cho bạn:

function combine(arr) { 
    var newObj = {}; 

    // combine the comments 
    for (var i=0; i < arr.length; i++) { 
     if (newObj[arr[i].itemId]) { 
      newObj[arr[i].itemId].push(arr[i].comments); 
     } else { 
      newObj[arr[i].itemId] = [arr[i].comments]; 
     } 
    } 

    // make the list 
    var keys = Object.keys(newObj); 
    return keys.map(function(key){return {itemId: key, comments: newObj[key]} }) 
} 
+0

Lưu ý rằng thứ tự 'Object.keys' không được xác định rõ và bạn có thể sắp xếp lại các phần tử một cách vô tình. –

+0

Cũng lưu ý 'Object.keys' không tồn tại trong IE và phải được thêm vào (es5shim) –

+1

Ngoài ra, vì bạn đã sử dụng ES5, bạn có thể thích' Array # map' cho bước cuối cùng. Nó dễ đọc hơn một chút ;-) –

1

Bạn cũng có thể sử dụng filter():

function combine(src) { 
    var dict = {}; 
    return src.filter(function(item) { 
     if (!dict[item.itemId]) { 
      item.comments = [ item.comments ]; 
      dict[item.itemId] = item; 
      return true; 
     } else { 
      dict[item.itemId].comments.push(item.comments); 
      return false; 
     } 
    }); 
} 
Các vấn đề liên quan