2017-04-07 94 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

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

相关问题