2015-07-21 57 views
-1

我想將複雜的對象數組文件映射到單個級別的數組。例如..多級對象到單個級別對象

[{ 
    name: 'birds', 
    references: [{ name: 'owl', value: 20 }, 
       { name: 'sparrow', value: 23 }], 
    identified: { created: '2014-02-02' } 
}, { 
    name: 'animals', 
    references: [{ name: 'cat', value: 20 }, 
       { name: 'deer', value: 23 }], 
    identified: { created: '2014-02-02' } 
}] 

目的是把陣列分成一些這樣的事情,而不管該複雜的

[{name: 'birds', references-owl: 20, references-sparrow: 23, identified-created: '2014-02-02'}, 
{name: 'animals', references-cat: 20, references-deer: 23, identified-created: '2014-02-02'}] 

基本上,如果通過通過每個屬性在陣列中的每個項目,然後循環迴路。

如果該屬性是一個數組,則將屬性添加到父對象,該屬性的鍵由數組中的name屬性和父鍵值(如'references-owl')以及該屬性的值組成。所有其他數組對象可以在第一級之外被忽略。

如果該屬性是一個對象,則將該對象前綴爲父屬性並將其添加到父對象。如果存在子數組,請重複上述操作。

在此先感謝!

+0

這是一個很好的算法,你在這裏。你能發佈你的嘗試嗎? –

+0

這不清楚嗎?這個用戶有2組數據,他正在尋找將第一個數據轉換爲後者。 – Cerbrus

+0

@Cerbrus,不清楚提問者對我們的期望是什麼(你有沒有在這裏看到過問題?)。除非他們希望我們爲他們實現該算法,而我剛纔所看到的算法。我以爲你知道得更好。 –

回答

0

.map().reduce()組合正是你所需要的是什麼:

var data = [{ 
 
    name: 'birds', 
 
    references: [{ name: 'owl', value: 20 }, 
 
       { name: 'sparrow', value: 23 }], 
 
    identified: { created: '2014-02-02' } 
 
}, { 
 
    name: 'animals', 
 
    references: [{ name: 'cat', value: 20 }, 
 
       { name: 'deer', value: 23 }], 
 
    identified: { created: '2014-02-02' } 
 
}]; 
 

 
var result = data.map(function(row){ // For each row in data. 
 
    // Set the static data in the result row 
 
    var reference = { name: row.name, 'identified-created': row.identified.created }; 
 
    
 
    // Iterate over `row.references`, and add the current reference to the result. 
 
    row.references.reduce(function(previous, current){ 
 
    previous['reference-' + current.name] = current.value; 
 
    return previous; 
 
    }, reference); 
 
    
 
    return reference; 
 
}); 
 

 
console.log(result);

+0

謝謝@Cerbrus。上面的答案非常有趣。如果它是一個像{x:{y:{z:{name:'cat',value:'12'}}},a:1}到{}的對象,是否可以減少沒有靜態數據引用的對象? a:1,xyz-cat:12}。這只是出於好奇,因爲我試圖瞭解如何實施減少。 – user3722809

+0

是的,這是可能的,但是你需要構建一個遞歸函數來檢查更深的層次......這是一個完全不同的問題。 – Cerbrus