2017-02-21 79 views
-2

我試圖在lodash中堆棧JavaScript對象數組值,其中每個數組值都將映射到對象的結果數組中的相應對象。例如:在lodash中將JavaScript數組堆棧到對象值中

olympicmedals = { 
    '2008': [{'country': 'China', 'golds': 51}, {'country': 'USA', 'golds': 36}], 
    '2012': [{'country': 'China', 'golds': 38}, {'country': 'USA', 'golds': 46}] 
} 

期望的結果:

olympicmedals = [ 
    {'country': 'China', 'golds2008': 51, 'golds2012': 38}, 
    {'country': 'USA', 'golds2008': 36, 'golds2012': 46} 
] 

FWIW,這是爲在圖表amCharts,如所見here(點擊 '查看演示源' 在其中)。

我假設_.map()函數是要走的路,只是不太確定如何繼續。謝謝!

+4

請閱讀[問]。重要短語:「搜索和研究」和「解釋......阻止你自己解決它的任何困難」。關於如何合併/映射數組,有很多關於SO的問題。 –

+0

經過多年的使用SO的參考,這是我的第一個問題,經過搜索和研究,並打磚牆。無論如何,感謝您的建議!如果以前有人問過這個問題,或者我錯過了一些關鍵問題/參考資料,我會很感激鏈接到原始的,我們可以將其標記爲重複。另外,我看到很多很多問題都沒有「解釋......任何困難」。也許這應該被視爲一個更具體的問題? – drhenish

+0

只因爲很多人沒有做正確的事,並不代表沒事。當然,你可以花幾分鐘時間告訴我們你已經嘗試了什麼,這樣我們就不會重複這種努力了? –

回答

2

您可以使用forEach()循環,但您也必須循環陣列中的每個對象,以便您可以將多個年份添加到鍵。它也可以處理更多的對象屬性,而不僅僅是金牌。

var data = { 
 
    '2008': [{ 
 
    'country': 'China', 
 
    'golds': 51, 
 
    silver: 10 
 
    }, { 
 
    'country': 'USA', 
 
    'golds': 36 
 
    }], 
 
    '2012': [{ 
 
    'country': 'China', 
 
    'golds': 38 
 
    }, { 
 
    'country': 'USA', 
 
    'golds': 46, 
 
    bronze: 10 
 
    }] 
 
} 
 

 
var result = [] 
 
Object.keys(data).forEach(function(e) { 
 
    var that = this; 
 
    data[e].forEach(function(a) { 
 
    if (!that[a.country]) { 
 
     that[a.country] = { 
 
     country: a.country 
 
     } 
 
     Object.keys(a).forEach(function(key) { 
 
     if (key != 'country') that[a.country][e + key] = a[key] 
 
     }) 
 
     result.push(that[a.country]) 
 
    } else { 
 
     Object.keys(a).forEach(function(key) { 
 
     if (key != 'country') that[a.country][e + key] = a[key] 
 
     }) 
 
    } 
 
    }) 
 
}, {}) 
 

 
console.log(JSON.stringify(result, 0, 4))

+0

謝謝,這當然有效。我希望只使用一個函數來編碼效率和可讀性,而不是嵌套for循環(這實際上是lodash的全部點)。但是,我最終使用這種方法,儘管仍然使用_.forEach()而不是普通的JavaScript。 – drhenish

1

晚了一點,但這裏有一個地圖/減少的方式來做到這一點:

o = { 
 
    '2008': [{'country': 'China', 'golds': 51}, {'country': 'USA', 'golds': 36}], 
 
    '2012': [{'country': 'China', 'golds': 38}, {'country': 'USA', 'golds': 46}] 
 
} 
 

 
const countries = o[Object.keys(o)[0]].map(e => e.country) 
 

 
const result = countries.map(country => { 
 
    return Object.keys(o).reduce((p, year) => { 
 
    p[`golds${year}`] = o[year].find(e => e.country === country).golds 
 
    return p 
 
    }, {country}) 
 
}) 
 
console.log(result)

對於這種轉變的任務,我覺得首先獲取列信息並將其存儲在變量中很方便(countries),基於此可以在後面關聯數據filterfind。也許還有一種方法可以在沒有任何本地州的情況下做到這一點,但我可以想象它不會很可讀。

相關問題