将对象数组转换为对象

时间:2021-07-12 06:54:09

标签: javascript

我正在尝试使用 Javascript 将对象数组转换为键和值对。我尝试了 reduce 方法,但它不起作用。请帮助将其转换为键和值。

Locations = ["locOne","locTwo"]
[
  {
    "userId": "234d5aa0",
    "officeLocation": "locOne",
  },
  {
    "userId": "234d5aa0",
    "officeLocation": "locOne",
  },
  {
    "userId": "fecac9a9ecb8",
    "officeLocation": "locTwo",
  }
]

我想要的

{
  "locOne": [
    {
      "userId": "234d5a",
      "officeLocation": "locOne"
    },
    {
      "userId": "234d5aa0",
      "officeLocation": "locOne"
    }
  ],
  "locTwo": [
    {
      "userId": "fecac9a9ecb8",
      "officeLocation": "locTwo"
    }
  ]
}

2 个答案:

答案 0 :(得分:1)

这是一个使用 Array.prototype.reduce

的简单方法

const a = [
  {"userId": "234d5aa0","officeLocation": "locOne",},
  {"userId": "234d5aa0","officeLocation": "locOne",},
  {"userId": "fecac9a9ecb8","officeLocation": "locTwo",}
];

const b = a.reduce((ob, item) => {
  if (!ob[item.officeLocation]) ob[item.officeLocation] = [];
  ob[item.officeLocation].push(item);
  return ob;
}, {});

console.log(b)

如果您有一个位置列表作为参考过滤器,您可以使用 Array.prototype.includes 进行测试:

const locations = ["locOne", "locTwo"]

const a = [
  {"userId": "134d5aa0","officeLocation": "locOne"},
  {"userId": "234d5aa0","officeLocation": "locOne"},
  {"userId": "fecac9a9","officeLocation": "locTwo"},
  {"userId": "123321fa","officeLocation": "locThree"},
];

const b = a.reduce((ob, item) => {
  const loc = item.officeLocation;
  if (locations.includes(loc)) {
    if (!ob[loc]) ob[loc] = [];
    ob[item.officeLocation].push(item);
  }
  return ob;
}, {});

console.log(b)

答案 1 :(得分:0)

这似乎是一个非常糟糕的主意,但你开始吧。

const data = [
  {
    "userId": "234d5aa0",
    "officeLocation": "locOne",
  },
  {
    "userId": "234d5aa0",
    "officeLocation": "locOne",
  },
  {
    "userId": "fecac9a9ecb8",
    "officeLocation": "locTwo",
  }
];

const final = {};

for (doc of data) {
  final[doc.officeLocation] = final[doc.officeLocation] || [] // Use ??= here if possible
  final[doc.officeLocation].push(doc);
}

console.log(final)