2016-10-18 5 views
1

У меня есть массив таких объектов. И они продублированы свойство значения «CONTACTNAME»Объединить массив объектов с подчеркиванием

[ 
    { 
     categoryId:1 
     categoryName:"Default" 
     contactId:141 
     contactName:"Anonymous" 
     name:"Mobile" 
     value:"+4417087654" 
    }, 
    { 
     categoryId:1 
     categoryName:"Default" 
     contactId:325 
     contactName:"Anonymous" 
     name:"Email" 
     value:"[email protected]" 
    }, 
    { 
     categoryId:1 
     categoryName:"Default" 
     contactId:333 
     contactName:"Anonymous" 
     name:"Email" 
     value:"[email protected]" 
    } 
] 

Я хочу, чтобы объединить их в одном объекте по имени свойства «CONTACTNAME» Чтобы что-то вроде этого

[ 
    { 
     categoryId: 1, 
     categoryName: "Default", 
     contactId: 141, 
     contactName: "Anonymous", 
     names: { 
      1: "Mobile", 
      2: "Email", 
      3: "Email" 
     }, 
     values: { 
      1: '+2234324', 
      2: "[email protected]", 
      3: "[email protected]" 
     } 
    } 
]; 

Edit: Как можно Я группирую объекты также по categoryName?

+0

Вы просто хотите сохранить первое свое 'значение contactId' правильно ..? – Redu

+0

Кажется, вы выбрасываете разные «contactId's». Это намеренно? – Oberon

+0

Что произойдет с контактом? – shanks

ответ

2
var grouped = _.groupBy(input, 'contactName'); 
var output = _.map(grouped, function(entries) { 
    return _.extend(
    _.pick(entries[0], 'categoryId', 'categoryName', 'contactId', 'contactName'), 
    { 
     names: _.indexBy(_.pluck(entries, 'name'), function(val, index) { return index +1; }), 
     values: _.indexBy(_.pluck(entries, 'value'), function(val, index) { return index +1; }) 
    } 
); 
}); 

https://jsfiddle.net/f1x4tscu/3/

1

Другой вариант с массивом внутри объекта

var grouped = _.groupBy(this.contacts, 'contactName'); 
var output = _.map(grouped, function (entries) { 
    return _.extend(
     _.pick(entries[0], 'categoryId', 'categoryName', 'contactId', 'contactName'), 
     { 
      addresses: _.map(entries, function (m) { 
       return { 
        name: m.name, 
        value: m.value 
       } 
      }), 
     } 
    ); 
}); 
Смежные вопросы