【问题标题】:How can I sort an ImmutableJS List object on multiple keys?如何在多个键上对 ImmutableJS List 对象进行排序?
【发布时间】:2017-10-25 15:48:37
【问题描述】:

我有一个包含 startend 日期字段的工作历史对象列表。我需要按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;
        }
    });

【问题讨论】:

    标签: javascript sorting immutable.js


    【解决方案1】:

    你可以像这样把它放到一个比较函数中:

    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);
    });
    

    【讨论】:

      【解决方案2】:

      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;
          });
      

      【讨论】:

        猜你喜欢
        • 2010-11-11
        • 1970-01-01
        • 2013-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-24
        • 2011-12-23
        相关资源
        最近更新 更多