问题描述
我从平面数据库接收到一些数据,如下所示:
[{
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
}];