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

时间:2018-08-09 13:37:55

标签: javascript arrays

有没有一种方法可以以不完整的阵列完成缺失的月份和销售。

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

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},
];

5 个答案:

答案 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));