仅按关键部件将平面数据库中的关键值分组

问题描述

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

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

在vanila js中或使用像lodash之类的lib将其按键中的数字分组(15478、24547等)进行转换会是更简单的方法

例如:

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

预先感谢您的帮助。

解决方法

您可以使用reduce,并在回调函数中使用lastIndexOf来获取最后一个_。然后检查累加器对象是否存在与数字相同的键。如果没有,请创建密钥并为其添加值。

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

let newData = data.reduce((acc,curr) => {
  const _key = curr.key;
  const getNum = _key.substr(_key.lastIndexOf('_') + 1,_key.length);
  if (!acc[getNum]) {
    acc[getNum] = []
  }
  acc[getNum].push(curr)
  return acc;
},{});
console.log([newData])

,

如果输入数组未排序,则首先需要根据key对其进行排序。 因此,经过排序后,它将如下所示:

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

,然后继续使用reduce

将对象推入累加器

let arr= [ { key: "user_15478",value: "xxx" },{ key: "user_name_15478",{ key: "user_age_15478",value: 5 },{ key: "user_24547",{ key: "user_name_24547",{ key: "user_age_24547",value: 12 },{ key: "user_42412",{ key: "user_name_42412",{ 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)

,

这是使用Array.reduce()

的解决方案
const transformed = data.reduce((acc,user) => {
    const [ key ] = user.key.match(/\d+$/);
    if (!(key in acc)) {
        acc[+key] = [];
    }
    acc[+key].push(user);
    return acc;
},{});

给出data是:

[{
    key: "user_15478",value: "xxx"
},value: 5
},value: 12
},value: 42
}];