首页 > 解决方案 > 从对象数组构建邻接矩阵

问题描述

我有一个简单的 JavaScript 对象数组,例如

const drawings = [
  {
    name: "Foo",
    category: "widget"
  },
  {
    name: "Bar",
    category: "widget"
  },
  {
    name: "Bar",
    category: "fidget"
  },
]

等,其中名称和类别都有重复。我想要结束的本质上是一个对象列表(这是为了满足第 3 方库的接口),其中每个对象代表一个名称,然后对于每个类别都有一个属性,该属性为真或假,取决于原始列表。因此,对于示例,输出将是:

const output = [
  {
    name: "Foo",
    widget: true,
    fidget: false
  },
  {
  {
    name: "Bar",
    widget: true,
    fidget: true
  },
]

标签: javascriptarraysjavascript-objects

解决方案


我将首先浏览并制作您的类别对象,其中类别为键,默认值为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))


推荐阅读