Построение матрицы смежности из массива объектов

1

У меня есть простой массив объектов 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
  },
]
  • 0
    Будете ли вы знать все категории заранее или вам нужно будет вывести их из drawings объекта?
  • 0
    Нужно выводить их. Могли бы сделать это в отдельном шаге, конечно.
Теги:
arrays
javascript-objects

2 ответа

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

Сначала я прохожу и создаю объект ваших категорий с категориями как ключи и значения по умолчанию как 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))
0

Если вы уже знаете категории или если вы их сделали, как вы предложили, вы можете использовать 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
}, [])
  • 0
    В строке, где вы называете acc.push , есть ли способ сделать это, не перечисляя все категории? Это то, что я пытаюсь избежать жесткого кодирования - то есть я легко могу иметь массив категорий, но не могу их так жестко кодировать. Вот почему я застрял.

Ещё вопросы

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