我正在尝试使用 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"
}
]
}
答案 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)