在JavaScript中将非嵌套对象格式化为嵌套对象



我们得到一个非嵌套对象

obj = {
"your-email": "some@email.com",
"prename": "Jane Doe",
"service__1": "Google",
"login__1": "support@google.com",
"password__1": "PW1",
"service__2": "Microsoft",
"login__2": "admin@email.com",
"password__2": "PW12!",
"service__3": "Stackoverflow",
"login__3": "supportadmin@email.com",
"password__3": "3PW2!",
"DPA": "1"
}

我们希望将此对象转换为以下结构:

nestedOBJ =         
{
"your-email": "some@email.com",
"prename": "Jane Doe",
"DPA": "1",
"service1": 
{
"service__1": "Google",
"login__1": "support@google.com",
"password__1": "PW1"
},
"service2": 
{
"service__2": "Microsoft",
"login__2": "admin@email.com",
"password__2": "PW12!"
},
"service3": 
{
"service__3": "mySQL",
"login__3": "supportadmin@email.com",
"password__3": "3PW2!"
},
"service4": 
{
"...":"..."
}
}

尝试了以下代码,但没有成功:

let res = {}
let length = Object.keys(obj).length -3;
for (let i = 0; i < length  ; i + 3){
console.log(steps.trigger.event.body[0]["service__"+i])
let onestedOBJ = {
["creds"+i]:steps.trigger.event.body[0]["service__"+i],
["creds"+i]:steps.trigger.event.body[0]["login__"+i],
["creds"+i]:steps.trigger.event.body[0]["password__"+i]
}  
console.log(nestedOBJ)
}

我们没有包括DPA、您的电子邮件和婚前姓名。因为for循环根本不起作用。

const nested = {};
for (const [key, value] of Object.entries(obj)) {
const [, num] = key.split("__");
if (num) {
const parentKey = `service${num}`;
if (nested[parentKey] === undefined) {
nested[parentKey] = {};
}

nested[parentKey][key] = value;
} else {
nested[key] = value;
}
}

Array#reduce是实现的一种方法

let obj = {
"your-email": "some@email.com",
"prename": "Jane Doe",
"service__1": "Google",
"login__1": "support@google.com",
"password__1": "PW1",
"service__2": "Microsoft",
"login__2": "admin@email.com",
"password__2": "PW12!",
"service__3": "Stackoverflow",
"login__3": "supportadmin@email.com",
"password__3": "3PW2!",
"DPA": "1"
}
let subitems = ["service", "login", "password"];
let nestedOBJ = Object.entries(obj).reduce((b, a) => {
let keya = a[0].split("__");
if (subitems.indexOf(keya[0]) > -1) {
b[`service${keya[1]}`] = b[`service${keya[1]}`] || {}
b[`service${keya[1]}`][keya[0]] = a[1];
} else b[a[0]] = a[1];
return b;
}, {});
console.log(nestedOBJ);