如何使用JavaScript填充数组中缺失的月份

3

是否有一种方法可以在不完整的数组中完成缺失的月份和销售额。

有时我会得到这样的查询:

var sales = [

    {'month': '04', 'sale': 126},
    {'month': '06', 'sale': 165},
    {'month': '07', 'sale': 10},
    {'month': '08', 'sale': 20},
    {'month': '09', 'sale': 211},
    {'month': '10', 'sale': 27},
    {'month': '11', 'sale': 112},
];

我需要添加销售为0的缺失月份。

我想可以创建第二个数组,包含所有月份,然后比较这两个数组并将重复项选择到包含所有月份的数组中:

var compareArray = [

    {'month': '01', 'sale': 0},
    {'month': '02', 'sale': 0},
    {'month': '03', 'sale': 0},
    {'month': '04', 'sale': 0},
    {'month': '05', 'sale': 0},
    {'month': '06', 'sale': 0},
    {'month': '07', 'sale': 0},
    {'month': '08', 'sale': 0},
    {'month': '09', 'sale': 0},
    {'month': '10', 'sale': 0},
    {'month': '11', 'sale': 0},
    {'month': '12', 'sale': 0},
];

创建一个数组,使得月份号成为该数组的索引,然后用新的0销售对象填充空槽。 - Pointy
5个回答

8

不必预先定义12个元素的数组,你可以使用 Array(12).keys() 并使用 Array.from 将其映射到所需的输出:

var sales = [{'month': '04', 'sale': 126}, {'month': '06', 'sale': 165}, {'month': '07', 'sale': 10},  {'month': '08', 'sale': 20}, {'month': '09', 'sale': 211}, {'month': '10', 'sale': 27}, {'month': '11', 'sale': 112}];

sales = Array.from(Array(12).keys(), month => 
    sales.find(sale => +sale.month === month+1) || { month: ("0"+(month+1)).substr(-2), sale: 0 }
);

console.log(sales);


1
它保存了 from,但在 map 发生之前创建了一个额外的数组。Array.from 回调机制避免了中间数组的创建。 - trincot
那么就没有什么可以“map”的了,@mplungjan:在Array(12)中没有条目,只有一个length - trincot
[...Array(12)] 可以被映射。 - dhilt
是的,@dhilt,那已经在上面建议过了:请看我的回复。 - trincot
我想尝试类似于 sales.push(...Array(12-sales.length).fill({month:0, sale:0})) 的东西,但最终放弃了。 - mplungjan
显示剩余2条评论

3
使用 .map 和 .find 数组方法的一种方法
const data = [
    {'month': '04', 'sale': 126},
    {'month': '06', 'sale': 165},
    {'month': '07', 'sale': 10},
    {'month': '08', 'sale': 20},
    {'month': '09', 'sale': 211},
    {'month': '10', 'sale': 27},
    {'month': '11', 'sale': 112},
];

const result = [...Array(12)].map((m, i) => {
  const month = i < 9 ? '0' + (i + 1) : String(i + 1);
  return data.find(d => d.month === month) || { month, sale: 0 };
});

0

由于您的月份数字是数字,并且跨越了一个方便的范围,因此您可以将它们用作数组索引:

var yearSales = sales.reduce(function(rv, month) {
  a[parseInt(month.month, 10)] = month;
  return a;
}, []);

然后你可以找到空槽:

for (let i = 0; i < 12; i++)
  if (!yearSales[i])
    yearSales[i] = { month: i, sales: 0 };

我没有使用.forEach(),因为它会跳过空槽,而我想要针对这些空槽进行操作。


0
你可以使用一个简单的 for 循环然后 Array.sort() 来获得所需的输出:

var sales = [{
    'month': '04',
    'sale': 126
  },
  {
    'month': '06',
    'sale': 165
  },
  {
    'month': '07',
    'sale': 10
  },
  {
    'month': '08',
    'sale': 20
  },
  {
    'month': '09',
    'sale': 211
  },
  {
    'month': '10',
    'sale': 27
  },
  {
    'month': '11',
    'sale': 112
  },
];
for (var i = 1; i <= 12; i++) {
  var existObj = sales.find(item => +item.month === i);
  if (!existObj) {
    sales.push({
      'month': i > 9 ? i : '0' + i,
      'sale': 0
    });
  }
}
sales.sort(function(a, b) {
  return +a.month - +b.month;
});
console.log(sales);


0

您可以使用我下面使用的相同方法。基本上只需循环1-12,如果找到缺少的月份,则将它们添加到数组中。一旦您在数组中拥有所有月份,只需根据月份编号按升序排序即可。

const sales = [{
    'month': '04',
    'sale': 126
  },
  {
    'month': '06',
    'sale': 165
  },
  {
    'month': '07',
    'sale': 10
  },
  {
    'month': '08',
    'sale': 20
  },
  {
    'month': '09',
    'sale': 211
  },
  {
    'month': '10',
    'sale': 27
  },
  {
    'month': '11',
    'sale': 112
  }
];

function generateSalesReport(salesData) {
  const monthsWithSales = [];
  const salesReport = [];
  salesData.forEach(el => {
    monthsWithSales.push(Number.parseInt(el.month));
    salesReport.push(el);
  });

  //Fill in the missing months
  for (let i = 1; i <= 12; i++) {
    if (monthsWithSales.indexOf(i) === -1) {
      let monthStr = i.toString();
      salesReport.push({
        'month': monthStr.length < 2 ? '0' + monthStr : monthStr,
        'sale': 0
      });
    }
  }

  //Sort the sales report array
  return salesReport.sort((a, b) => parseInt(a.month) - parseInt(b.month));
}

console.log(generateSalesReport(sales));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接