группировать объект по атрибуту, извлекая другие атрибуты в потомке сгруппированного результата

1

В нашем приложении у нас есть аутсорсинг из ввода поиска. Возвращаемый массив соответствует этой модели.

AutoSuggest[] = 
[
    {category: "CAR", type: "COMMON", suggests: ['ford', 'jeep']},
    {category: "TRAVEL", type: "SHORT", suggests: ['tokyo', 'paris', 'london']},
    {category: "TRAVEL", type: "LONG", suggests: ['costa rica', 'greenland']}}
]

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

[
    {
        category: "CAR",
        values: [
            { type: "COMMON", suggests: ['ford', 'jeep'] }
        ]
    },
    {
        category: 'TRAVEL',
        values: [
            { type: "SHORT", suggests: ['tokyo', 'paris', 'london'] },
            { TYPE: "LONG", suggests: ['costa rica', 'greenland'] }
        ]
    }
]

Попытка с lodash groupBy, мы просто получили наши предложения, помещенные в объекты CAR и TRAVEL. Но это не соответствует нашим потребностям, так как нам нужно сделать часть "извлечения" части исходного объекта.

Теги:
lodash

3 ответа

2
Лучший ответ

Вы можете использовать хеш-таблицу для группировки в одни и те же категории.

var data = [{ category: "CAR", type: "COMMON", suggests: ['ford', 'jeep'] }, { category: "TRAVEL", type: "SHORT", suggests: ['tokyo', 'paris', 'london'] }, { category: "TRAVEL", type: "LONG", suggests: ['costa rica', 'greenland'] }],
    hash = Object.create(null),
    grouped = [];

data.forEach(function (o) {
    if (!hash[o.category]) {
        hash[o.category] = { category: o.category, values: [] };
        grouped.push(hash[o.category]);
    }
    hash[o.category].values.push({ type: o.type, suggests: o.suggests });
});

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }
2

Поскольку вы используете lodash.
Вы могли бы сделать что-то вроде

const data = [
  {category: "CAR", type: "COMMON", suggests: ['ford', 'jeep']},
  {category: "TRAVEL", type: "SHORT", suggests: ['tokyo', 'paris', 'london']},
  {category: "TRAVEL", type: "LONG", suggests: ['costa rica', 'greenland']}
]
const grouped = _.chain(data).groupBy('category').map((values,category)=> ({category,values})).value()

console.log(grouped)

Это вернет требуемый результат.

1

Результат может быть получен из AutoSuggest исходного массива данных с ES6 Array.prototype.reduce АНБА Array.prototype.filter методами:

let result = AutoSuggest.reduce((acc, i) => {
  const value = { type: i.type, suggests: i.suggests };
  const found = acc.find(j => j.category === i.category);
  if(found) {
    found.values.push(value);
  }
  else {
    acc.push({ category: i.category, values: [ value ] });
  }
  return acc;
}, []);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню