В нашем приложении у нас есть аутсорсинг из ввода поиска. Возвращаемый массив соответствует этой модели.
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. Но это не соответствует нашим потребностям, так как нам нужно сделать часть "извлечения" части исходного объекта.
Вы можете использовать хеш-таблицу для группировки в одни и те же категории.
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; }
Поскольку вы используете 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)
Это вернет требуемый результат.
Результат может быть получен из 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;
}, []);