【问题标题】:Group array based on n keys of objectd基于对象的 n 个键的分组数组
【发布时间】:2020-07-19 09:54:26
【问题描述】:

根据 n 个键或嵌套键对包含 n 个对象的数组进行分组的最有效方法和方法是什么?

const data = [,
    {a: 1, b: 2, c:3},
    {d: 4, e: 5, f: 6},
    {a: 1, b: 2, c:3},
    {g: 7, h: 8, i: 9},
    {d: 4, e: 5, f: 6},
    {g: 7, h: 8, i: 9},
 ];

变成类似的东西

const grouped = [
 [
    {a: 1, b: 2, c:3},
    {a: 1, b: 2, c:3},
 ],
 [
    {d: 4, e: 5, f: 6},
    {d: 4, e: 5, f: 6},
 ],
 [
    {g: 7, h: 8, i: 9},
    {g: 7, h: 8, i: 9},
 ],
]

【问题讨论】:

  • 正确。你试过什么?您是否始终拥有相同的密钥,或者您是否拥有更多不影响分组的密钥?
  • 您要筛选多少数据?
  • {a: 1, b: 2, c:3}{a: 1, b: 2, c:4} 应该在同一个组中吗?
  • 你怎么知道一个项目进入哪个组?它必须与组中的其他项目完全匹配?
  • @NinaScholz 有时我有更多不应受分组影响的键。我试图根据我需要的键减少并创建一个新数组。

标签: javascript arrays algorithm object


【解决方案1】:
const data = [
{ a: 1, b: 2, c: 3 },
{ d: 4, e: 5, f: 6 },
{ a: 1, b: 2, c: 3 },
{ g: 7, h: 8, i: 9 },
{ d: 4, e: 5, f: 6 },
{ g: 7, h: 8, i: 9 },

];

function groupObjectByKey(data) {

var groupData = {}

const getKeys = (value) => Object.keys(value);

const groupKey = (keys) => keys.join(",");

data.forEach(value => {
    let key = groupKey(getKeys(value));
    if (groupData[key])
        groupData[key].push(value)
    else
        groupData[key] = [value];
})

return Object.values(groupData);

}

让结果 = groupObjectByKey(data); 控制台日志(结果)

【讨论】:

    【解决方案2】:

    想法是:

    • 使用查找表来存储相同身份的对象
    • 我们在这里使用的每个对象的标识是它的唯一键,在我下面的解决方案中,它是该对象的键值对的串联字符串
    • 记得按字母顺序对对象的键进行排序,以处理{a:1, b:2, c:3}{b:2, a:1, c:3} 的情况——基本相同

    这种方法的最坏情况时间复杂度是O(nm)ndata 数组的长度,@987654325 @对象键的长度)

    下面的 sn-p 演示了这个想法

    const lookup = {}
    
    const data = [
      { a: 1, b: 2, c: 3 },
      { b: 2, a: 1, c: 3 },
      { d: 4, e: 5, f: 6 },
      { a: 1, b: 2, c: 3 },
      { g: 7, h: 8, i: 9 },
      { d: 4, e: 5, f: 6 },
      { g: 7, h: 8, i: 9 },
    ]
    
    data.forEach((obj) => {
      const uniqueKey = Object.keys(obj)
        .sort()
        .map((k) => `${k}${obj[k]}`)
        .join("-")
    
      if (lookup[uniqueKey] !== undefined) {
        lookup[uniqueKey].push(obj)
      } else {
        lookup[uniqueKey] = [obj]
      }
    })
    
    const res = Object.values(lookup)
    console.log(res)

    【讨论】:

      猜你喜欢
      • 2018-04-01
      • 2021-01-27
      • 1970-01-01
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      • 2021-11-19
      • 2022-12-18
      相关资源
      最近更新 更多