Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将JavaScript对象展平为菊花链形式?_Javascript_Recursion_Typescript_Ecmascript 6_Flatten - Fatal编程技术网

如何将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;
}