javascript - 根据其他数组的内容创建一个对象数组 "complete"

标签 javascript

我有 3 个数组:

var countries = ['Montenegro', 'Spain', 'Belgium']
var years = ['2000', '2001', '2002', '2003'];
var death = ['cancer', 'measles'];

和一个对象数组:

var values = [
    {country:'Montenegro', year:'2000', death:'cancer', number:'50'},
    {country:'Montenegro', year:'2001', death:'cancer', number:'60'},
    {country:'Montenegro', year:'2002', death:'cancer', number:'70'},
    {country:'Montenegro', year:'2003', death:'cancer', number:'80'},
    {country:'Spain', year:'2000', death:'cancer', number:'NaN'},
    {country:'Spain', year:'2001', death:'cancer', number:'110'},
    {country:'Spain', year:'2002', death:'cancer', number:'120'},
    {country:'Spain', year:'2003', death:'cancer', number:'130'},
    {country:'Belgium', year:'2000', death:'cancer', number:'70'},
    {country:'Belgium', year:'2001', death:'cancer', number:'80'},
    {country:'Belgium', year:'2002', death:'cancer', number:'90.5'},
    {country:'Montenegro', year:'2000', death:'measles', number:''},
    {country:'Montenegro', year:'2001', death:'measles', number:'1'},
    {country:'Montenegro', year:'2002', death:'measles', number:'2'},
    {country:'Montenegro', year:'2003', death:'measles', number:'3'},
    {country:'Spain', year:'2000', death:'measles', number:'2'},
    {country:'Spain', year:'2001', death:'measles', number:'3'},
    {country:'Spain', year:'2002', death:'measles', number:'NaN'},
    {country:'Spain', year:'2003', death:'measles', number:'5'}
];

我想要的是一个“完整”的对象数组,其中包含三个数组中存在的所有可能的值组合。

values 事实上,不包含与以下内容相关的对象:

{country:'Belgium', year:'2003', death:'cancer', ...},
{country:'Belgium', year:'2000', death:'measles', ...},
{country:'Belgium', year:'2001', death:'measles', ...},
{country:'Belgium', year:'2002', death:'measles', ...},
{country:'Belgium', year:'2003', death:'measles', ...}

所以我想得到这个新对象(缺失的数据设置为NaN):

var valuesComplete = [
    {country:'Montenegro', year:'2000', death:'cancer', number:'50'},
    {country:'Montenegro', year:'2001', death:'cancer', number:'60'},
    {country:'Montenegro', year:'2002', death:'cancer', number:'70'},
    {country:'Montenegro', year:'2003', death:'cancer', number:'80'},
    {country:'Spain', year:'2000', death:'cancer', number:'NaN'},
    {country:'Spain', year:'2001', death:'cancer', number:'110'},
    {country:'Spain', year:'2002', death:'cancer', number:'120'},
    {country:'Spain', year:'2003', death:'cancer', number:'130'},
    {country:'Belgium', year:'2000', death:'cancer', number:'70'},
    {country:'Belgium', year:'2001', death:'cancer', number:'80'},
    {country:'Belgium', year:'2002', death:'cancer', number:'90.5'},
    {country:'Belgium', year:'2003', death:'cancer', number:NaN}, // <--
    {country:'Montenegro', year:'2000', death:'measles', number:''},
    {country:'Montenegro', year:'2001', death:'measles', number:'1'},
    {country:'Montenegro', year:'2002', death:'measles', number:'2'},
    {country:'Montenegro', year:'2003', death:'measles', number:'3'},
    {country:'Spain', year:'2000', death:'measles', number:'2'},
    {country:'Spain', year:'2001', death:'measles', number:'3'},
    {country:'Spain', year:'2002', death:'measles', number:'NaN'},
    {country:'Spain', year:'2003', death:'measles', number:'5'},
    {country:'Belgium', year:'2000', death:'measles', number:NaN}, // <--
    {country:'Belgium', year:'2001', death:'measles', number:NaN}, // <--
    {country:'Belgium', year:'2002', death:'measles', number:NaN}, // <--
    {country:'Belgium', year:'2003', death:'measles', number:NaN} // <--
];

新数组包含 24 个元素 = countries.length *years.length *death.length

最好的方法是什么?

最佳答案

您可以检查所有可能的组合。使用map循环遍历每个数组并使用find搜索它

var countries = ['Montenegro', 'Spain', 'Belgium']
var years = ['2000', '2001', '2002', '2003'];
var death = ['cancer', 'measles'];

var values = [
   {country:'Montenegro', year:'2000', death:'cancer', number:'50'},
   {country:'Montenegro', year:'2001', death:'cancer', number:'60'},
   {country:'Montenegro', year:'2002', death:'cancer', number:'70'},
   {country:'Montenegro', year:'2003', death:'cancer', number:'80'},
   {country:'Spain', year:'2000', death:'cancer', number:'NaN'},
   {country:'Spain', year:'2001', death:'cancer', number:'110'},
   {country:'Spain', year:'2002', death:'cancer', number:'120'},
   {country:'Spain', year:'2003', death:'cancer', number:'130'},
   {country:'Belgium', year:'2000', death:'cancer', number:'70'},
   {country:'Belgium', year:'2001', death:'cancer', number:'80'},
   {country:'Belgium', year:'2002', death:'cancer', number:'90.5'},
   {country:'Montenegro', year:'2000', death:'measles', number:''},
   {country:'Montenegro', year:'2001', death:'measles', number:'1'},
   {country:'Montenegro', year:'2002', death:'measles', number:'2'},
   {country:'Montenegro', year:'2003', death:'measles', number:'3'},
   {country:'Spain', year:'2000', death:'measles', number:'2'},
   {country:'Spain', year:'2001', death:'measles', number:'3'},
   {country:'Spain', year:'2002', death:'measles', number:'NaN'},
   {country:'Spain', year:'2003', death:'measles', number:'5'}
];

var valuesComplete = [countries, years, death].reduce((c, v) => [].concat(...c.map(o => v.map(x => [].concat(o, x)))))
                     .map(o => values.find(v => v.country === o[0] && v.year === o[1] && v.death === o[2]) || {country: o[0],year: o[1],death: o[2],number: NaN})

console.log(valuesComplete);

关于javascript - 根据其他数组的内容创建一个对象数组 "complete",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50653650/

相关文章:

javascript - 让 Laravel 应用程序既为基于浏览器的应用程序提供服务,又充当 iPhone 和 Android 应用程序的 API 的最佳实践是什么?

javascript - 在 keen client.query.then() 中调用 this.setState() 返回 cannot read property setState

Javascript 代码在 IE 中工作但在 Firefox 中不起作用?

javascript - 为什么我的 CSV 没有写入任何数据?

javascript - 如何在 react-native 功能组件中应用 PropType?

javascript - 非常奇怪的 jQuery/AJAX 行为

javascript - 实现撤消

javascript - 如何在 Nodejs 中本地签署 Tronix 交易?

javascript - 使用 lodash 在 reducer 中进行条件连接

javascript - addClass() 函数在 ajax 调用后不起作用