繁体   English   中英

如何在多个键上对ImmutableJS List对象排序?

[英]How can I sort an ImmutableJS List object on multiple keys?

我有一个包含start日期和end日期字段的工作历史记录对象列表。 我需要按start然后按end排序。 如果在我使用背对背sort()函数时工作历史对象之间的日期重叠,则该顺序可能会关闭。 我需要一种通过多个键对ImmutableJS列表进行排序的方法,其中仅当第一个键值相等时才处理第二个排序键。 我本来以为ImmutableJS有一种更简单的方式来处理这种类型的排序。 这是我想出的,但这对我来说太可怕了(使用momentJS进行日期比较):

    const sortedWorkHistory = workHistory.sort((b, a) => {
        const aTo = moment(a.get('to') === null ? undefined : a.get('to'));
        const bTo = moment(b.get('to') === null ? undefined : b.get('to'));

        if (aTo.isBefore(bTo)) {
            return -1;
        }

        if (bTo.isBefore(aTo)) {
            return 1;
        }

        return 0;
    })
    .sort((b, a) => {
        const aTo = moment(a.get('to') === null ? undefined : a.get('to'));
        const bTo = moment(b.get('to') === null ? undefined : b.get('to'));

        if (aTo === bTo) {
            const aFrom = moment(a.get('from'));
            const bFrom = moment(b.get('from'));

            if (aFrom.isBefore(bFrom)) {
                return -1;
            }

            if (bFrom.isBefore(aFrom)) {
                return 1;
            }

            return 0;
        }
    });

您可以将其放入单个比较函数中,如下所示:

const sortedWorkHistory = workHistory.sort((b, a) => {
    const aTo = moment(a.get('to'));
    const bTo = moment(b.get('to'));
    const aFrom = moment(a.get('from'));
    const bFrom = moment(b.get('from'));

    if (aTo.isBefore(bTo)) {
        return -1;
    } else if (bTo.isBefore(aTo)) {
        return 1;
    } else if (aFrom.isBefore(bFrom)) {
        return -1;
    } else if (bFrom.isBefore(aFrom)) {
        return 1;
    }

    return 0;
});

甚至

const sortedWorkHistory = workHistory.sort((b, a) => {
    // aTo = ... 

    if (aTo.isSame(bTo)) {
        return aFrom.diff(bFrom);
    }

    return aTo.diff(bTo);
});

aTo === bTo永远不会等于您定义它的方式。 您正在将引用与始终不同的对象进行比较。 您需要使用.isSame方法。 您可以尝试以下方法来验证:

const a = moment().startOf('day');
const b = moment().startOf('day');
console.log(a === b);  // false
console.log(a.isSame(b));  // true

这是我要做的:

// Helper function to create moments
function parseMoment(date) {
    return moment(date === null ? undefined : date);
}

const sortedWorkHistory = workHistory
    .sort((a, b) => parseMoment(a.get('to')).diff(parseMoment(b.get('to'))))
    .sort((a, b) => {
        if(parseMoment(a.get('to')).isSame(parseMoment(b.get('to')))) {
            return parseMoment(a.get('from')).diff(parseMoment(b.get('from')))
        }
        return 0;
    });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM