Я пытаюсь создать службу, которая будет принимать диапазон дат и вернуть массив недель.Проблема с цепочкой и возвращаемым массивом из Angular Service/Factory
Я сейчас в точке, где я связываю свои сервисные функции, чтобы вернуть массив (он работает без цепочки, но я не могу вернуть массив), и именно в этой цепочке я получаю сообщение об ошибке: ТипError: data.map (...). Sort (...). То не функция.
Это моя служба/завод вызов:
$scope.weeks = GroupDateRangeService.createArray(timeline_data);
Это моя служба/завод:
(function() {
'use strict';
angular
.module('portalDashboardApp')
.factory('GroupDateRangeService', GroupDateRangeService);
GroupDateRangeService.$inject = [];
function GroupDateRangeService() {
var service = {
createArray: createArray,
};
return service;
function createArray(data) {
var arr = data.map(function (s) {
var week = getWeekNumber(parseISOLocal(s));
return week[0] + ('0' + week[1]).slice(-2) + ':' + s;
}).sort()
.then(function() {
createGroupObject(arr);
})
.then(function() {
createGroupedArray(groupedObj)
})
return groupedArray;
};
function createGroupObject(arr) {
var groupedObj = arr.reduce(function (result, value) {
var b = value.split(':');
if (!result[b[0]]) result[b[0]] = [];
result[b[0]].push(b[1]);
return result;
}, {});
};
function createGroupedArray(groupedObj) {
// Grab arrays in order of week number. Sort keys to maintain order
var groupedArray = Object.keys(groupedObj).sort().map(key=>groupedObj[key]);
// Final set of grouped dates
console.log(groupedArray.join('\n\n'))
return groupedArray;
}
/* Helper to get the ISO week number of a date
** @param {Date} date to get week of
** @returns {Array} [year, weekNumber]
*/
function getWeekNumber(d) {
d = new Date(+d);
d.setHours(0, 0, 0, 0);
d.setDate(d.getDate() + 4 - (d.getDay() || 7));
var yearStart = new Date(d.getFullYear(), 0, 1);
var weekNo = Math.ceil((((d - yearStart)/86400000) + 1)/7);
return [d.getFullYear(), weekNo];
}
/* Parse ISO 8601 format date string to local date
** @param {string} s - string to parse like 2016-12-15
** @returns {Date}
*/
function parseISOLocal(s) {
var b = s.split(/\D/);
return new Date(b[0], b[1] - 1, b[2]);
}
}
})();
Порядок создания массива недели выглядит следующим образом:
- createArray (данные), а затем передать результат в
- createGroupObject (ARR), а затем передать результат в
- createGroupedArray (groupedObj) возвращают массив;
Возможно, существует более простой способ сделать это, и мой подход может быть ошибочным. Поэтому я буду очень благодарен за вашу помощь!
Благодарим за помощь! :) – onmyway
Добро пожаловать. –