2013-06-06 2 views
6

Я столкнулся с этой проблемой в нескольких контекстах и ​​языках, и мне всегда удалось обойти ее, но я хотел бы, наконец, найти правильный шаблон для справитесь с этим. Это связано с объединением таблиц SQL. Обычно я делал два вызова, один для элементов и один для комментариев, но я знаю, что есть способ получить все это за один звонок, а затем сгладить результат.Сглаживание массива объектов в другой массив объектов с использованием javascript

То, что я хотел бы сделать, это принять массив, который выглядит следующим образом:

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

И превратить его в это:

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

whathaveyoutried dot com – akonsu

ответ

1

Следующая должно работать для вас:

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

Обратите внимание, что порядок 'Object.keys' не определен, и вы можете случайно изменить порядок элементов. –

+0

Также примечание 'Object.keys' не существует в IE и должно быть добавлено (es5shim) –

+1

Кроме того, поскольку вы уже используете ES5, вам может понадобиться' Array # map' для последнего шага. Это немного более читаемо ;-) –

1

Также вы можете использовать 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; 
     } 
    }); 
} 
Смежные вопросы