Я читал об этом симптоме:
https://www.alex -arriaga.com / как получить одинаковые результаты при сортировке javascript-массивов во всехбраузеры /
https://levelup.gitconnected.com/cross-browser-crazy-44e90d61b204
Как отсортировать массив по свойству даты
и попытаться реализовать решениесоответственно, но все еще сталкивается с тем же несоответствием в браузере при сортировке массива по дате!
Я пытался добавить уникальный идентификатор для каждого элемента массива (согласно этому сообщению: См. ), но это неНе помогло:
function sortByDateConsistent(itemA, itemB) {
const valueA = itemA.date;
const valueB = itemB.date;
// 1. Adding parsing of strings to Date
// Using moment.js, get last version of it from: http://momentjs.com/
// Please be sure about using a valid ISO 8601 format:
// "Deprecation warning: moment construction falls back to js Date.
// This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info."
const a = moment(valueA);
const b = moment(valueB);
let r = 0;
// 2. Comparing two Dates (have to be valid dates)
if (a.isValid() && b.isValid()) {
r = ((a.valueOf() > b.valueOf()) ? -1 : ((a.valueOf() < b.valueOf()) ? 1 : 0));
}
// 3. In case of dates are equal apply same logic with the unique key to provide the stable sorting
if(r === 0){
r = (typeof itemA.key !== 'undefined' && typeof itemB.key !== 'undefined')?
itemA.key - itemB.key : 0;
}
return r;
}
function uniqueNumber() {
let date = Date.now();
if (date <= uniqueNumber.previous) {
date = ++uniqueNumber.previous;
} else {
uniqueNumber.previous = date;
}
return date;
}
uniqueNumber.previous = 0;
function ID(){
return uniqueNumber();
};
Код сортировки массива:
groups = filteredProjects.length > 0 ? filteredProjects.reduce((groups, project) => {
//const date = project.Properties.ModificationTime.Value.split('T')[0];
//const month = moment(project.Properties.ModificationTime.Value, 'YYYY-MM-DD').format('MMM');
//console.log(project)
if (project.Properties) {
const date = moment(project.Properties.ModificationTime.value, 'YYYY-MM-DD').format('MMM-YYYY');
if (!groups[date]) {
groups[date] = [];
}
groups[date].push(project);
} else {
if (!groups[/*lastDate*/ "Others"]) {
groups[/*lastDate*/ "Others"] = [];
}
groups[/*lastDate*/ "Others"].push(project);
}
return groups;
}, {}) : [];
const groupedProjects = Object.keys(groups).map((date) => {
return {
// key : ID(),
date,
projects: groups[date].sort((a, b) => new Date(a.Properties.ModificationTime.value) > new Date(b.Properties.ModificationTime.value) ? -1 :
new Date(a.Properties.ModificationTime.value) < new Date(b.Properties.ModificationTime.value ? 1 : 0))
// projects: groups[date].sort((a, b) => new Date(b.Properties.ModificationTime.value) - new Date(a.Properties.ModificationTime.value))
};
});
// groupedProjects.sort((a, b) => new Date(b.date) - new Date(a.date)); //Working differently in different browsers!
groupedProjects.sort((a, b) => new Date(a.date) > new Date(b.date) ? -1 : new Date(a.date) < new Date(b.date) ? 1 : 0);
// groupedProjects.sort(sortByDateConsistent)
// console.log("Grouped Projects: ", groupedProjects)
return groupedProjects
}
образец данных:
Я сортирую группы и проекты внутри каждой группы.