2017-03-08 16 views
1

私は次のようにデイジーチェーン形に...JavaScriptオブジェクトをデイジーチェーンのような形に平坦化する方法は?

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' } 
    ] 
}; 

...このようなオブジェクトをフラット化したい:

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; 
} 
:ここ

{ 
    "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" 
} 

は私の試みを(失敗)です

内側のオブジェクトと配列をデイジーチェーンするために、コードが不必要に繰り返され始めました。これは間違いなく再帰を必要とするものです。何か案は?

編集:この質問はotherquestionsに似ていますが、重複はありません。この質問には、特定の表記法とネストされたオブジェクトと配列が同時に必要です。

編集:私はまた、反対の、平らでない、another questionで尋ねました。

+0

はあなたがcar.revisions [0] .miles' '上' car.revisions.0.miles'をしてもよろしいです?私は[タグ:asp-net.mvc]がネイティブに2番目のものを使用するので(私は最初に尋ねているので、タグ付けしていません)、私は尋ねます。 –

+0

[ネストされたJSONオブジェクトをフラット/アンフラットするための最速の方法]の可能な複製(http://stackoverflow.com/questions/19098797/fastest-way-to-flatten-un-flatten-nested-json-objects) –

+0

@ ErikPhilips car.revisions.0.milesは、私が探している結果です – nunoarruda

答えて

1

このような再帰関数を作成し、以前のキーを1つの文字列に保存することができます。

var obj1 = { 
 
    firstName: 'John', 
 
    lastName: 'Green', 
 
    car: { 
 
    make: 'Honda', 
 
    model: 'Civic', 
 
    revisions: [ 
 
     { miles: 10150, code: 'REV01', changes: 0}, 
 
     { 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' } 
 
    ] 
 
}; 
 

 
function flatten(data, c) { 
 
    var result = {} 
 
    for(var i in data) { 
 
    if(typeof data[i] == 'object') Object.assign(result, flatten(data[i], c + '.' + i)) 
 
    else result[(c + '.' + i).replace(/^\./, "")] = data[i] 
 
    } 
 
    return result 
 
} 
 

 
console.log(JSON.stringify(flatten(obj1, ''), 0, 4))

0

これを試してみてください。

function flatten(obj) 
 
{ 
 
    var result = {}; 
 
    (function f(e, p) { 
 
    switch (typeof e) { 
 
     case "object": 
 
     p = p ? p + "." : ""; 
 
     for (var i in e) 
 
      f(e[i], p + i); 
 
     break; 
 
     default: 
 
     result[p] = e; 
 
     break; 
 
    } 
 
    })(obj); 
 
    return result; 
 
} 
 

 
var obj1 = { 
 
    firstName: 'John', 
 
    lastName: 'Green', 
 
    car: { 
 
    make: 'Honda', 
 
    model: 'Civic', 
 
    revisions: [{ 
 
     miles: 10150, 
 
     code: 'REV01', 
 
    }, { 
 
     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' 
 
    }] 
 
}; 
 

 
console.log(flatten(obj1));

関連する問題