У меня есть простой массив объектов JavaScript, например, например
const drawings = [
{
name: "Foo",
category: "widget"
},
{
name: "Bar",
category: "widget"
},
{
name: "Bar",
category: "fidget"
},
]
и т.д., где и название, и категория имеют дубликаты. То, что я хочу в конечном итоге, - это, по сути, список объектов (это соответствует интерфейсу для сторонней библиотеки), где каждый объект представляет собой имя, а затем для каждой категории есть свойство, которое является либо истинным, либо ложным, в зависимости от исходного списка. Таким образом, для примера выход будет:
const output = [
{
name: "Foo",
widget: true,
fidget: false
},
{
{
name: "Bar",
widget: true,
fidget: true
},
]
Сначала я прохожу и создаю объект ваших категорий с категориями как ключи и значения по умолчанию как false
.
Затем вы можете назначить это каждому объекту и установить правильные ключи в true при прохождении.
const drawings = [{name: "Foo",category: "widget"},{name: "Bar",category: "widget"},{name: "Bar",category: "fidget"},]
// make category object where everything is false
let category_obj = drawings.reduce((a, item) => (a[item.category] = false, a), {})
let output = drawings.reduce((a, {name, category}) => {
// assign cat
if (!a.hasOwnProperty(name)) a[name] = Object.assign({}, {name}, category_obj)
// set to true if the correct category
a[name][category] = true
return a
}, {})
// the above makes an object, but you only want the array of values
console.log(Object.values(output))
Если вы уже знаете категории или если вы их сделали, как вы предложили, вы можете использовать Array.reduce() следующим образом:
drawings.reduce(function(acc, curr) {
if (!acc.some(elt => elt.name === curr.name)) {
acc.push({name: curr.name, widget: false, fidget: false})
}
const i = acc.findIndex(elt => elt.name === curr.name)
acc[i][curr.category] = true
return acc
}, [])
acc.push
, есть ли способ сделать это, не перечисляя все категории? Это то, что я пытаюсь избежать жесткого кодирования - то есть я легко могу иметь массив категорий, но не могу их так жестко кодировать. Вот почему я застрял.
drawings
объекта?