2017-04-07 354 views
1

我有兩個數組,我想合併成一個對象。我舉了一些我擁有的和我想達到的例子。我嘗試了_.union和其他幾種下劃線方法。如何按照包含每個對象中存在的屬性的唯一值的另一個數組的順序對對象數組進行排序?

var original = [ 
    { 
    Country: 'US', 
    value: '10' 
    }, 
    { 
    Country: 'Turkey', 
    value: '5' 
    } 
]; 

var newlist =["Afghanistan", "Antarctica","Turkey"] 

結果我想:

var results= [ 
    { 
    Country: 'Afghanistan', 
    value: '0' 
    }, 
    { 
    Country: 'Antarctica', 
    value: '0' 
    }, 
    { 
    Country: 'Turkey', 
    value: '5' 
    } 
]; 

,美國不會出現在最終的結果,因爲newlist在美國沒有。因此,新列表中的所有值基本上都會以原始列表中的值顯示在結果中。

+1

您是否試過編寫一些代碼? – bhspencer

+0

嘗試_.union,但它將最後一個列表附加到第一個列表。這不是我想要的。我發現你可以做.merge,但下劃線沒有合併。 –

+0

如果你想合併這兩個數組在哪裏是對象與國家:'美國'在你的預期輸出? – repzero

回答

5

非下劃線解決方案,即.map() S中的新的數組,從原始數組返回對象,如果它可以.find()它,否則返回一個新的對象:

var original = [ 
 
    { Country: 'US', value: '10' }, 
 
    { Country: 'Turkey', value: '5' } 
 
]; 
 

 
var newlist =["Afghanistan", "Antarctica","Turkey"] 
 

 
var result = newlist.map(function(v) { 
 
    return original.find(function(o) { return o.Country === v }) 
 
     || { Country: v, value: '0' } 
 
}) 
 

 
console.log(result)

這是帶ES6箭頭的單線功能:

var original = [ 
 
    { Country: 'US', value: '10' }, 
 
    { Country: 'Turkey', value: '5' } 
 
]; 
 

 
var newlist =["Afghanistan", "Antarctica","Turkey"] 
 

 
var result = newlist.map(v => original.find(o => o.Country===v) || {Country:v, value:'0'}) 
 

 
console.log(result)

+0

超棒的男人!它像一個魅力! –

相關問題