Javascript - сортировка по дате ведет себя по-разному в разных браузерах - PullRequest
0 голосов
/ 04 ноября 2019

Я читал об этом симптоме:

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
}

образец данных:

enter image description here

Я сортирую группы и проекты внутри каждой группы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...