Javascript 如何使用递归展平NodeJSON文件
我有一个非常复杂的嵌套json文件,需要使用递归遍历它 我需要的是Javascript 如何使用递归展平NodeJSON文件,javascript,node.js,json,recursion,Javascript,Node.js,Json,Recursion,我有一个非常复杂的嵌套json文件,需要使用递归遍历它 我需要的是 将最内层值的值指定给其父键 删除最里面的键和值 删除空对象 我已经尝试了很多方法,但我对javascript世界还不熟悉,无法找到正确的解决方案。 我的json嵌套如下 { "Changes_Only": { "_text": "some value" },
{
"Changes_Only": {
"_text": "some value"
},
"Legal_Employee_Id": {},
"EmployeeData": {
"OBJECT_ACTION_ID": {
"_text": "some value"
},
"Employee": {
"PersonID": {
"_text": "some value"
},
"PersonID_OLD": {},
"PersonNumber": {
"_text": "some value"
},
"PersonNumber_OLD": {},
"StartDate": {
"_text": "some value"
},
"StartDate_OLD": {},
"PersonType": {
"_text": "some value"
},
"PersonType_OLD": {},
"DateofBirth": {
"_text": "some value"
},
"DateofBirth_OLD": {},
"HireDate": {
"_text": "some value"
},
"HireDate_OLD": {},
"WorkEmail": {
"_text": "some value"
},
"WorkEmail_OLD": {},
"FirstName": {
"_text": "some value"
},
"FirstName_OLD": {},
"LastName": {
"_text": "some value"
},
"LastName_OLD": {}
},
"NationalIDHT": {
"NtionalIDData": {
"NationalIDValues": {
"NationalType": {
"_text": "some value"
},
"NationalIDNumber": {
"_text": "some value"
}
}
}
},
"AssignmentHT": {
"AssignmentData": {
"Assignment": {
"PersonNumber": {
"_text": "some value"
},
"PersonNumber_OLD": {},
"WorkerNumber": {
"_text": "some value"
},
"WorkerNumber_OLD": {},
"Gender": {
"_text": "some value"
},
"Gender_OLD": {},
"ActionName": {
"_text": "some value"
},
"ActionName_OLD": {},
"HourlySalaried": {
"_text": "some value"
},
"HourlySalaried_OLD": {},
"SalaryBasis": {
"_text": "some value"
},
"SalaryBasis_OLD": {},
"ManagerPersonNumber": {
"_text": "some value"
},
"ManagerPersonNumber_OLD": {},
"ManagerDisplayName": {
"_text": "some value"
},
"ManagerDisplayName_OLD": {},
"AssignmentCategory": {
"_text": "some value"
},
"AssignmentCategory_OLD": {},
"AsgState": {
"_text": "some value"
},
"AsgState_OLD": {},
"JobCode": {
"_text": "some value"
},
"JobCode_OLD": {},
"Desgination": {
"_text": "some value"
},
"Desgination_OLD": {},
"Grade": {
"_text": "some value"
},
"Grade_OLD": {},
"Levele-Grade": {
"_text": "some value"
},
"Levele-Grade_OLD": {},
"Department": {
"_text": "some value"
},
"Department_OLD": {},
"EmployeeType": {
"_text": "some value"
},
"EmployeeType_OLD": {},
"BusinessUnit": {
"_text":"some value"
},
"BusinessUnit_OLD": {},
"BaseLocation": {
"_text":"some value"
},
"BaseLocation_OLD": {},
"PhysicalWorkAddress": {
"_text":"some value"
}
}
}
}
}
}
下面我需要的json也可以帮助我删除空对象
{
"Changes_Only": "some value",
"EmployeeData": {
"OBJECT_ACTION_ID": "some value",
"Employee": {
"PersonID": "some value",
"PersonNumber": "some value",
"StartDate": "some value",
"PersonType": "some value",
"DateofBirth": "some value",
"HireDate": "some value",
"WorkEmail": "some value",
"FirstName": "some value",
"LastName": "some value"
},
"NationalIDHT": {
"NtionalIDData": {
"NationalIDValues": {
"NationalType": "some value",
"NationalIDNumber": "some value"
}
}
},
"AssignmentHT": {
"AssignmentData": {
"Assignment": {
"PersonNumber": "some value",
"WorkerNumber": "some value",
"Gender": "some value",
"ActionName": "some value",
"HourlySalaried": "some value",
"SalaryBasis": "some value",
"ManagerPersonNumber": "some value",
"ManagerDisplayName": "some value",
"AssignmentCategory": "some value",
"AsgState": "some value",
"JobCode": "some value",
"Desgination": "some value",
"Grade": "some value",
"Levele-Grade": "some value",
"Department": "some value",
"EmployeeType": "some value",
"BusinessUnit": "some value",
"BaseLocation": "some value",
"PhysicalWorkAddress": "some value"
}
}
}
}
}
实际上,这里不需要JSON解析——可以使用正则表达式。用“some value”替换“{u text”:“some value”}就可以了 像这样:
str.replace(/{\s*"_text":\s*("[^"]*")\s*}/, "$1")
我会照顾你的
“PersonNumber”:{“\u text”:“some value”},
及
将清除空属性试试这个我只是在纠正@Konstantin Pribluda
const r = { ...} // Input JSON
JSON.parse(JSON.stringify(r).replace(/{\s*"_text":\s*("[^"]*")\s*}/g, "$1").replace(/"[^"]*"\s*:\s*{},/g,""))
其次,替换为空{},这里有一个答案,它不依赖于字符串操作,而是使用对象扫描 字符串操作有它的位置,但在这里它可能会导致问题(例如,修剪在其属性被修剪后变为空的对象)。所以这个答案应该比那些使用字符串操作的答案更受欢迎
//const objectScan=require('object-scan');
const input={“仅更改”:{“文本”:“某些值”},“法律雇员Id”:{},“雇员数据”:{“对象行动Id”:{“文本”:“某些值”},“雇员”:{“PersonID”:{“PersonID”:{“PersonID”:“某些值”},“PersonID”OLD”:{“PersonNumber”:{“文本”:“某些值”},“PersonNumber”OLD{},“StartDate”:{type”{,“PersonType_OLD”:{},“DateofBirth”:{{},“DateofBirth_OLD”:{},“HireDate”:{{},“HireDate_OLD”:{},“WorkEmail”:{{},“WorkEmail_OLD”:{},“FirstName”:{{},“FirstName”:{{{},“LastName”:{{{}文本”:“some value”},“LastName{},“NationalOfIdValued”:{}”NationalType:{U-text:{some value:},“NationalNumber:{U-text:“some value”}}}}},“AssignmentHT:{”AssignmentData:{“Assignment:{”PersonNumber:{U-text:“some value”},“PersonNumber:{OLD:{},“WorkerNumber:{U-text:{”WorkerNumber:{},“WorkerNumber:{OLD:{},”性别:{U-text:“some value:{”性别:{OLD:{ActionName:{ActionText:{ActionName:{“:{},”HourlySalaried:{{{U text:“some value”},“HourlySalaried”{},“salarybase:{{U text:“some value”},“salarybase:“some value”},“ManagerPersonNumber:{{U text:“some value”},“ManagerPersonNumber”{},“ManagerDisplayName:{{U text:{some value”},“ManagerDisplayName”{},“AssignmentCategory:{text:{,“AsgState:{{U text:{U OLD:{},”AsgState:{},“JobCode:{U text:“some value”},“JobCode:{}”,Desgination:{{U text:“some value”},“Desgination:{U OLD:{},”Grade:{{U text:“some value”},“Grade:{},”Levele Grade:{{E Grade:{E:{U text:“some value”},“Levele-Grade:{lade:{Department:{Department:{Department:{Department:{value”},Department:{Department:{some value“}”,EmployeeType_OLD:{},“BusinessUnit:{{u text:“some value”},“BusinessUnit_OLD:{},“BaseLocation:{u text:“some value”},“BaseLocation_OLD:{}”,PhysicalWorkAddress:{{u text:“some value”};
常量重写=(数据)=>{
objectScan(['**']{
breakFn:({value,gparent,gproperty})=>{
如果(值的类型=='string'){
gparent[gproperty]=值;
}
},
filterFn:({value,parent,property})=>{
if(对象的值instanceof&&Object.keys(值).length==0){
删除父项[属性];
}
}
})(数据);
};
console.log(重写(输入));
//=>未定义
控制台日志(输入);
/* => {
仅更改“某些值”,
雇员数据:{
对象\u操作\u ID:“某些值”,
雇员:{
PersonID:“某些值”,
PersonNumber:“某些值”,
StartDate:“某个值”,
PersonType:“某些值”,
出生日期:“某个值”,
雇佣:“一些价值”,
工作电子邮件:“一些价值”,
名字:“某个值”,
LastName:“某些值”
},
DHT:{
Ntiodata:{
国家价值:{
NationalType:“某些值”,
国有数字:“一些价值”
}
}
},
转让日期:{
分配数据:{
任务:{
PersonNumber:“某些值”,
WorkerNumber:“某些值”,
性别:'一些价值',
ActionName:“某些值”,
Hourlysalarized:“一些价值”,
工资基础:“一些价值”,
ManagerPersonNumber:“某些值”,
ManagerDisplayName:“某些值”,
AssignmentCategory:“某些值”,
AsgState:“某些值”,
作业代码:“某些值”,
设计:“一些价值”,
等级:'某些值',
“等级”:“某些值”,
部门:'一些价值',
EmployeeType:“某些值”,
业务单元:“一些价值”,
BaseLocation:“某些值”,
PhysicalWorkAddress:“某些值”
}
}
}
}
}
*/
。作为控制台包装{最大高度:100%!重要;顶部:0}
我已经编辑了它谢谢@Biswabhusanc你能在这里检查验证吗谢谢@BiswaBhusan我现在已经做了它在JSON字符串上没有做任何更改它正在更改,但在我的answeradd/mg正则表达式末尾只更正了一次
const r = { ...} // Input JSON
JSON.parse(JSON.stringify(r).replace(/{\s*"_text":\s*("[^"]*")\s*}/g, "$1").replace(/"[^"]*"\s*:\s*{},/g,""))