javascript - 在对象数组中对动态键进行分组
问题描述
我有一个我正在尝试转换的对象
var data = {
"A": {"XY1" : 1},
"B": {"XY2": 12},
"C": {"XY3": 10},
"D": {"XY1": 2}
我正在尝试将其转换为
[
{ "XY1": { 1:"A", 2:"D"}},
{ "XY2": { 12:"B"}},
{ "XY3": { 8:"A", 10:"C"}},
]
(我们可以忽略 XY1、XY2 等的排序)
这是我到目前为止所做的 -
var result = Object.keys(data).flatMap(alphabet => {
return Object.keys(data[alphabet]).map(group => {
return Object.assign({}, {
[group]: { [data[alphabet][group]]: alphabet }
})
});
});
console.log(result);
哪个打印
[
{"XY1":{"1":"A"}},
{"XY3":{"8":"A"}},
{"XY2":{"12":"B"}},
{"XY3":{"10":"C"}},
{"XY1":{"2":"D"}}
]
但是,我希望它通过使用 reduce(chaining) 进行分组,例如 -
var result = Object.keys(data).flatMap(alphabet => {
return Object.keys(data[alphabet]).map(group => {
return Object.assign({}, {
[group]: { [data[alphabet][group]]: alphabet }
})
});
}).reduce((obj, item) => {
});
这可能吗 ?我如何按这些动态键分组?
非常感谢帮助!
解决方案
我首先使用哈希表进行分组:
const hash = {};
for(const [key, obj] of Object.entries(data)) {
for(const [key2, values] of Object.entries(obj)) {
if(!hash[key2]) hash[key2] = {};
for(const value of [values].flat())
hash[key2][value] = key;
}
}
然后得到一个数组,你可以使用Object.entries
:
const result = Object.entries(hash).map(([key, value]) => ({ key, value }));
这并不完全是您想要的,但老实说,我没有看到拥有一组对象的感觉,每个对象只有一个键。
推荐阅读
- docker - 当操作系统已经安装了 python/node.js 时,我还需要通过 docker 容器文件安装 Node.js 或 Python 吗?
- php - Google 客户端返回 JWT ErrorException:提供的密钥参数不能被强制转换为私钥
- java - 为什么没有 volatile 的 DCL 对原语有效?
- c# - MathF.Clamp 问题
- javascript - 使用 Thymeleaf 访问外部 Javascript (Chart.js)
- multiprocessing - 解决 pytorch 分布式执行为每个生成的进程打印多个日志语句?
- android - 如何在android studio中用另一个按钮修改一个按钮的效果?
- keras - 如何在 keras 中实现多状态 LSTM RNN
- algorithm - 动态规划问题,找到对商店的最佳访问
- tensorflow - 在 tensorflow 中结合 map 和 padded_batch