首页 > 解决方案 > 仅按关键部分对平面数据库中的键值进行分组

问题描述

我从一个平面数据库收到一些数据,如下所示:

[{
        key: "user_15478",
        value: "xxx"
    }, {
        key: "user_name_15478",
        value: "xxx"
    }, {
        key: "user_age_15478",
        value: 5
    }, {
        key: "user_24547",
        value: "xxx"
    }, {
        key: "user_name_24547",
        value: "xxx"
    }, {
        key: "user_age_24547",
        value: 12
    }, {
        key: "user_42412",
        value: "xxx"
    }, {
        key: "user_name_42412",
        value: "xxx"
    }, {
        key: "user_age_42412",
        value: 42
    }
]

什么是更简单的方法,在 vanila js 中或使用像 lodash 这样的库来转换它,按密钥中的数字(15478、24547 等)分组。

例如:

[{
        15478: [{
                key: "user_15478",
                value: "xxx"
            }, {
                key: "user_name_15478",
                value: "xxx"
            }, {
                key: "user_age_15478",
                value: 5
            }
        ]
    }, {
        24547: [{
                key: "user_24547",
                value: "xxx"
            }, {
                key: "user_name_24547",
                value: "xxx"
            }, {
                key: "user_age_24547",
                value: 12
            }
        ]
    }, {
        42412: { {
                key: "user_42412",
                value: "xxx"
            }, {
                key: "user_name_42412",
                value: "xxx"
            }, {
                key: "user_age_42412",
                value: 42
            }
            ]
        }
        ]

在此先感谢您的帮助。

标签: javascriptarrayssortingobjectlodash

解决方案


如果您的输入数组未排序,那么您首先需要根据 对其进行排序key。所以排序后会是这样的:

[{key: "user_15478",
 value: "xxx"
 },
{key: "user_24547",
 value: "xxx"
 },
.... //then _age wise
{key: "user_age_42412",
 value: "xxx"
 },
... //then _name wise 
{key: "user_name_42412",
 value: "xxx"
 },
]

然后简单地继续将对象推到累加器使用reduce

let arr= [ { key: "user_15478", value: "xxx" }, { key: "user_name_15478", value: "xxx" }, { key: "user_age_15478", value: 5 }, { key: "user_24547", value: "xxx" }, { key: "user_name_24547", value: "xxx" }, { key: "user_age_24547", value: 12 }, { key: "user_42412", value: "xxx" }, { key: "user_name_42412", value: "xxx" }, { key: "user_age_42412", value: 42 }, ];

arr = arr.sort((a, b) => a.key > b.key ? 1 : -1)

let result=arr.reduce((acc, val) => {
  let field = val.key.split("_")
  if (field.length === 2) {
    acc[field[1]] = [{ ...val
    }]
  }
  else
  acc[field[2]].push(val)
  return acc;
}, {})
let wrappedResult=Object.keys(result).map(key=>({[key]:result[key]}))
console.log(wrappedResult)


推荐阅读