首页 > 解决方案 > 在对象数组中对动态键进行分组

问题描述

我有一个我正在尝试转换的对象

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) => {

});

这可能吗 ?我如何按这些动态键分组?

非常感谢帮助!

标签: javascriptarraysobjectgrouping

解决方案


我首先使用哈希表进行分组:

  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 }));

这并不完全是您想要的,但老实说,我没有看到拥有一组对象的感觉,每个对象只有一个键。


推荐阅读