Объединить массив объектов с подчеркиванием

#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; })
    }
  );
});
  

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

Ответ №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
                }
            }),
        }
    );
});