按月分割数组

时间:2018-05-26 00:51:34

标签: javascript angularjs json

我有一个json,其中只有当前年份的数据,日期是ISODATE格式,我怎么能,角度1按月分隔json对象,例如,将数据抛给另一个json,对应于月份在变量日期定义。

我做了以下事情:

.then(function(resp) {
vm.acoesAno = resp.data
angular.forEach(vm.acoesAno, function(value, key){
    angular.forEach(vm.acoesAno, function(value, key){
        const date = new Date(value.data)
        const mes = date.getMonth()
        if (mes == 0){
            vm.jan = vm.acoesAno[key]
        } else if (mes == 1){
            vm.fev = vm.acoesAno[key]
        } else if (mes == 2){
            vm.mar = vm.acoesAno[key]
        } else if (mes == 3){
            vm.abr = vm.acoesAno[key]
        } else if (mes == 4){
            vm.mai = vm.acoesAno[key]
        } else if (mes == 5){
            vm.jun = vm.acoesAno[key]
        } else if (mes == 6){
            vm.jul = vm.acoesAno[key]
        } else if (mes == 7){
            vm.ago = vm.acoesAno[key]
        } else if (mes == 8){
            vm.set = vm.acoesAno[key]
        } else if (mes == 9){
            vm.out = vm.acoesAno[key]
        } else if (mes == 10){
            vm.nov = vm.acoesAno[key]
        } else if (mes == 11){
            vm.dez = vm.acoesAno[key]
        }
    })  
})  

console.log("mes de maio: ", vm.mai)}

json vm.acoesAno中有两个对象在5月份注册,但是在forEach之外的变量中我只得到1个对象,forEach中的变量存储了两个对象。

JSON DATA vm.acoesAno:

{
    data : "2018-05-06T03:00:00.000Z",
    longitude : "-52.018375",
    latitude : "-27.226520",
    dataCadastro : "2018-05-22T02:57:01.443Z"
}

但是json中有几个具有不同日期的对象。

@ vol7ron

return from console.log(grouped[4])

2 个答案:

答案 0 :(得分:0)

不再熟悉Angular了,但是:

  • 您应该能够将对象传递给迭代器函数
  • 您可能不需要使用月份名称作为键,只需使用他们的整数
  • 我不确定为什么在这种情况下使用了两个循环 - 不足以满足要求吗?
  • 您只有一个值,因为您正在使用作业(vm.mai = vm.acoesAno[key])而不是添加到集合或数组,这意味着您将覆盖每次迭代

.then(function(resp) {
  vm.acoesAno = resp.data
  let grouped = {}
  angular.forEach(vm.acoesAno, function(value, key, obj) {
    const date = new Date(value.data)
    const mes = date.getMonth()
    if (typeof grouped[+mes] == 'undefined')
      grouped[+mes]=[]

    grouped[+mes].push(obj);
  })

  console.log("mes de maio: ", grouped[4])
})
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

答案 1 :(得分:0)

您可以使用Array.prototype.filter和正则表达式匹配特定月份来过滤数据

&#13;
&#13;
// if you want to make it efficient, you can do something

  .then(function(resp) {
    const data = resp.data;
    vm.jan = [];
    vm.fev = [];
    // initialize all arrays to empty array
    vm.acoesAno = data;
    data.forEach(item => {
       if (/(.*)-01-(.*)/.test(item.data)){
          vm.jan.push(item);
       } else if (/(.*)-02-(.*)/.test(item.data)){
         vm.fev.push(item);
       } else if (/(.*)-03-(.*)/.test(item.data)){
          vm.mar.push(item);
       }
      // and so on 
    });

// 2nd method

.then(function(resp) {
    const data = resp.data;
    vm.acoesAno = data;
    vm.jan = data.filter(item => /(.*)-01-(.*)/.test(item.data);
    vm.fev = data.filter(item => /(.*)-02-(.*)/.test(item.data);
    vm.mar = data.filter(item => /(.*)-03-(.*)/.test(item.data);
    vm.abr = data.filter(item => /(.*)-04-(.*)/.test(item.data);
    // and so on for all other months

});
&#13;
&#13;
&#13;