Используйте первый и последний элемент (даты) в массиве для создания obj.имя в угловой фабрике / обслуживании

У меня есть метод Angular service/factory, который принимает в качестве параметра переданный ему в виде массива массивов, содержащих объекты [[{},{}],[{},{}]].

Данные, содержащиеся в этом параметре, состоят из массивов недель, с объектом для каждого дня, состоящим из даты и целого значения. Бывший. {"2017-01-10": 711}.

Функция метода состоит в том, чтобы сгруппировать каждый массив недель в одном объекте с суммированием его целочисленных значений. Бывший. {"name": "Week 1", "total": 3228}

Как я могу взять первый и последний элемент каждого массива и создать имя/метку из этого? Таким образом, выход будет выглядеть следующим образом: {"name": "Week 1 - 2017-01-10 to 2017-01-15", "total": 3228}

Вот пример данных, переданных в метод:

[
   [
      {
         "2016-11-01": 319
      },
      {
         "2016-11-02": 782
      },
      {
         "2016-11-03": 579
      },
      {
         "2016-11-04": 642
      },
      {
         "2016-11-05": 444
      },
      {
         "2016-11-06": 274
      }
   ],
   [
      {
         "2016-11-07": 319
      },
      {
         "2016-11-08": 782
      },
      {
         "2016-11-09": 579
      },
      {
         "2016-11-10": 642
      },
      {
         "2016-11-11": 444
      },
      {
         "2016-11-12": 274
      },
      {
         "2016-11-13": 481
      }
   ]
]

Вот метод:

function assignWeekNamesAndTotals(arrayOfWeeks) {

    var data = arrayOfWeeks;

    var result = data.reduce(function (p, c, i) {

        var total = c.reduce(function (total, obj) {
            for (var k in obj) {
                total += obj[k]; // calculate total
            }
            return total;
        }, 0);

        // Format object in any format you want
        var tmp = {};
        tmp.name = "Week " + (i + 1)
        tmp.total = total;

        p.push(tmp)
        return p;
    }, [])

    console.log("Assign Week names and Totals Output (Step 2: " + JSON.stringify(result, null, "   "));
    return result;   
}

Я ценю ваше руководство!

1 ответ

  1. Я смог создать решение, выполнив следующие действия:

    Я создал метод внутри моего метода, который создает массив дат. Затем я просто использую первый и последний элемент в массиве для моего периода.

    function assignWeekNamesAndTotals(arrayOfWeeks) {
    
        var data = arrayOfWeeks;
    
        var result = data.reduce(function (p, c, i) {
    
            var dateArray = [];
    
            var createDateArray = c.forEach(function (obj) {
    
                var dateFromObj = Object.keys(obj)[0];
    
                dateArray.push(dateFromObj);
    
                return dateArray;
            });
    
            var total = c.reduce(function (total, obj) {
    
                for (var k in obj) {
                    total += obj[k]; // calculate total
                }
                return total;
            }, 0);
    
            // Format object in any format you want
            var tmp = {};
            var first = dateArray[0];
            var last = dateArray[dateArray.length - 1]
            tmp.name = "Week: from " + first + " to " + last;
            tmp.total = total;
    
            p.push(tmp)
            return p;
        }, [])
        console.log("Assign Week names and Totals Output (Step 2: " + JSON.stringify(result, null, "   "));
        return result;
    }
    

    Выходные данные следующие:

    [
       {
          "name": "Week: from 2017-01-10 to 2017-01-15",
          "total": 3228
       },
       {
          "name": "Week: from 2017-01-16 to 2017-01-16",
          "total": 363
       }
    ]