如何将JavaScript对象展平为菊花链形式?
我想把这样的物体展平如何将JavaScript对象展平为菊花链形式?,javascript,recursion,typescript,ecmascript-6,flatten,Javascript,Recursion,Typescript,Ecmascript 6,Flatten,我想把这样的物体展平 var obj1 = { firstName: 'John', lastName: 'Green', car: { make: 'Honda', model: 'Civic', revisions: [ { miles: 10150, code: 'REV01', changes: }, { miles: 20021, code: 'REV02', changes: [ { type: 'asthe
var obj1 = {
firstName: 'John',
lastName: 'Green',
car: {
make: 'Honda',
model: 'Civic',
revisions: [
{ miles: 10150, code: 'REV01', changes: },
{ miles: 20021, code: 'REV02', changes: [
{ type: 'asthetic', desc: 'Left tire cap' },
{ type: 'mechanic', desc: 'Engine pressure regulator' }
] }
]
},
visits: [
{ date: '2015-01-01', dealer: 'DEAL-001' },
{ date: '2015-03-01', dealer: 'DEAL-002' }
]
};
。。。变成菊花链形式,如下所示:
{
"firstName": "John",
"lastName": "Green",
"car.make": "Honda",
"car.model": "Civic",
"car.revisions.0.miles": 10150,
"car.revisions.0.code": "REV01",
"car.revisions.0.changes": ,
"car.revisions.1.miles": 20021,
"car.revisions.1.code": "REV02",
"car.revisions.1.changes.0.type": "asthetic",
"car.revisions.1.changes.0.desc": "Left tire cap",
"car.revisions.1.changes.1.type": "mechanic",
"car.revisions.1.changes.1.desc": "Engine pressure regulator",
"visits.0.date": "2015-01-01",
"visits.0.dealer": "DEAL-001",
"visits.1.date": "2015-03-01",
"visits.1.dealer": "DEAL-002"
}
以下是我(失败的)尝试:
我很快开始不必要地重复代码,以便菊花链内部对象和数组。这绝对是需要递归的东西。有什么想法吗
编辑:此问题类似于但不是重复问题。这个问题需要一个特定的符号,同时嵌套对象和数组
编辑:我也问了相反的问题,unflatten,in.您可以创建这样的递归函数,将以前的键存储在一个字符串中很重要
var obj1={
名字:“约翰”,
姓氏:“绿色”,
汽车:{
制造‘本田’,
模型:“公民”,
修订:[
{miles:10150,代码:'REV01',更改:0},
{miles:20021,代码:'REV02',更改:[
{类型:'Asthic',描述:'Left tire cap'},
{类型:“机械”,描述:“发动机压力调节器”}
] }
]
},
访问:[
{日期:'2015-01-01',经销商:'DEAL-001'},
{日期:'2015-03-01',经销商:'DEAL-002'}
]
};
函数展平(数据,c){
var result={}
用于(数据中的var i){
if(数据类型[i]==“object”)object.assign(结果,展平(数据[i],c+'.+i))
else结果[(c+'.+i).替换(/^\./,“”)]=数据[i]
}
返回结果
}
console.log(JSON.stringify(flatte(obj1',),0,4))
试试这个:
函数展平(obj)
{
var result={};
(功能f(e,p){
开关(e型){
案例“对象”:
p=p?p+“:”;
用于(e中的变量i)
f(e[i],p+i);
打破
违约:
结果[p]=e;
打破
}
})(obj);
返回结果;
}
变量obj1={
名字:“约翰”,
姓氏:“绿色”,
汽车:{
制造‘本田’,
模型:“公民”,
修订:[{
迈尔斯:10150,
代码:“REV01”,
}, {
迈尔斯:20021,
代码:“REV02”,
变化:[{
类型:'哮喘',
描述:“左胎盖”
}, {
类型:“机械师”,
描述:“发动机压力调节器”
}]
}]
},
访问:[{
日期:“2015-01-01”,
经销商:“DEAL-001”
}, {
日期:“2015-03-01”,
经销商:“交易-002”
}]
};
console.log(展平(obj1))代码>是否确实要将车.revisions.0.英里
覆盖车.revisions[0].英里
?我这样问是因为我会在本机使用第二个版本(但是你没有标记它,所以我先问)。可能重复的@ErikPhilips car.revisions.0.miles是我正在寻找的可能重复的结果
function flatten(obj) {
var flattenObject = {};
// iterate given object
for (let x in obj) {
if (typeof obj[x] == 'string') {
flattenObject[x] = obj[x];
}
if (typeof obj[x] == 'object') {
for (let y in obj[x]) {
flattenObject[x + '.' + y] = obj[x][y];
}
}
}
return flattenObject;
}