#javascript #backbone.js #underscore.js
#javascript #backbone.js #underscore.js
Вопрос:
У меня есть массив таких объектов. И они имеют дублированные значения свойства ‘ContactName’
[
{
categoryId:1
categoryName:"Default"
contactId:141
contactName:"Anonymous"
name:"Mobile"
value:" 4417087654"
},
{
categoryId:1
categoryName:"Default"
contactId:325
contactName:"Anonymous"
name:"Email"
value:"test2@gmail.com"
},
{
categoryId:1
categoryName:"Default"
contactId:333
contactName:"Anonymous"
name:"Email"
value:"ivdtest@test.com"
}
]
Я хочу объединить их в один объект по имени свойства ‘ContactName’
К чему-то вроде этого
[
{
categoryId: 1,
categoryName: "Default",
contactId: 141,
contactName: "Anonymous",
names: {
1: "Mobile",
2: "Email",
3: "Email"
},
values: {
1: ' 2234324',
2: "ivdtest@test.com",
3: "test2@gmail.com"
}
}
];
Редактировать: как я могу группировать объекты также по categoryName
?
Комментарии:
1. Вы просто хотите сохранить
contactId
правильное значение первого ..?2. Кажется, вы отбрасываете разные
contactId
s. Это намеренно?3. что произойдет с ContactID?
4.
contactId
может быть из значения массива [0]5. Массив контактов внутри объекта имел бы больше смысла. Внутри массива каждый контакт является объектом
{ name: "Mobile", value: " 2234324" }
Ответ №1:
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; })
}
);
});
Ответ №2:
Другой вариант с массивом внутри объекта
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
}
}),
}
);
});