有没有一种方法可以以不完整的阵列完成缺失的月份和销售。
有时我会收到这样的查询:
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 :(得分:5)
您可以使用str_extract_all
并使用Array(12).keys()
将其映射到所需的输出,而不是预先定义12个条目的数组:
Array.from
答案 1 :(得分: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 };
});
答案 2 :(得分: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);
答案 3 :(得分: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()
,因为它跳过了空插槽,而这些正是我要定位的插槽。)
答案 4 :(得分: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));