【问题标题】:Sort an array of objects with 6 conditions使用 6 个条件对对象数组进行排序
【发布时间】:2021-06-11 23:32:41
【问题描述】:

我非常坚持对我的对象数组进行排序。

const users = useMemo(() => [userDetails, ...otherParticipants]
        .sort((a, b) => b.isTyping - a.isTyping)
        .sort((a, b) => b.liveDetails.status - a.liveDetails.status)
        .sort((a, b) => b.hasRaisedHand - a.hasRaisedHand)
        .sort((a, b) => b.isOnline - a.isOnline)     
, [userDetails, otherParticipants])

我尝试了链式排序,但效果不错。然后我尝试了有条件的,但似乎没有任何东西可以处理我需要排序的所有内容。我真的很感激一些指导。抱歉发了这么长的帖子……

[
        {
        
           isOnline: true,
           hasRaisedHand: false,
           isTyping: false,
           liveDetails: {
              status: 'pending',
              camera: false,
              mic: false,
           },
        },
          {
        
           isOnline: true,
           hasRaisedHand: false,
           isTyping: false,
           liveDetails: {
              status: 'active',
              camera: false,
              mic: false,
           },
        },
    {
        
           isOnline: false,
           hasRaisedHand: false,
           isTyping: false,
           liveDetails: {
              status: 'disabled',
              camera: false,
              mic: false,
           },
        },
    {
        
           isOnline: true,
           hasRaisedHand: false,
           isTyping: true,
           liveDetails: {
              status: 'disabled',
              camera: false,
              mic: false,
           },
        },

    {
        
           isOnline: true,
           hasRaisedHand: true,
           isTyping: false,
           liveDetails: {
              status: 'disabled',
              camera: false,
              mic: false,
           },
        },
]

这是我需要对象排序的顺序:

isTyping: true
status: 'active'
status: 'pending'
hasRaisedHand: true
isOnline: true
isOnline: false

示例:具有isTyping: true 键的对象应位于具有status: 'pending' 的对象之前。

示例 2:如果一个对象有status: 'pending',但也有isTyping: true,它应该在数组的前面。

这是对象需要排序的顺序,但我似乎根本无法让它工作。

这将是我需要的顺序:

    [
                
                  
            
            {
                
                   isOnline: true,
                   hasRaisedHand: false,
                   **isTyping: true,**
                   liveDetails: {
                      status: 'disabled',
                      camera: false,
                      mic: false,
                   },
                },
    {
                
                   isOnline: true,
                   hasRaisedHand: false,
                   isTyping: false,
                   liveDetails: {
                      **status: 'active',**
                      camera: false,
                      mic: false,
                   },
                },
    {
                
                   isOnline: true,
                   hasRaisedHand: false,
                   isTyping: false,
                   liveDetails: {
                      **status: 'pending',**
                      camera: false,
                      mic: false,
                   },
                },
        
            {
                
                   isOnline: true,
                   **hasRaisedHand: true**,
                   isTyping: false,
                   liveDetails: {
                      status: 'disabled',
                      camera: false,
                      mic: false,
                   },
                },
{
                
                   **isOnline: true,**
                   hasRaisedHand: false,
                   isTyping: false,
                   liveDetails: {
                      status: 'disabled',
                      camera: false,
                      mic: false,
                   },
                },
    {
                
                   **isOnline: false,**
                   hasRaisedHand: false,
                   isTyping: false,
                   liveDetails: {
                      status: 'disabled',
                      camera: false,
                      mic: false,
                   },
                },
        ]

【问题讨论】:

  • liveStatusTypes.disabled是什么意思?
  • 嗨,我编辑了我的帖子以更清晰

标签: javascript arrays sorting object methods


【解决方案1】:

您可以通过使用对象对各种状态进行排序,将sort 的内部 条件链接起来。

const
    data = [{ isOnline: true, hasRaisedHand: false, isTyping: false, liveDetails: { status: 'pending', camera: false, mic: false } }, { isOnline: true, hasRaisedHand: false, isTyping: false, liveDetails: { status: 'active', camera: false, mic: false } }, { isOnline: false, hasRaisedHand: false, isTyping: false, liveDetails: { status: 'disabled', camera: false, mic: false } }, { isOnline: true, hasRaisedHand: false, isTyping: true, liveDetails: { status: 'disabled', camera: false, mic: false } }, { isOnline: true, hasRaisedHand: true, isTyping: false, liveDetails: { status: 'disabled', camera: false, mic: false } }],
    status = { active: 1, pending: 2, disabled: 3 };

data.sort((a, b) =>
    b.isTyping - a.isTyping ||
    status[a.liveDetails.status] - status[b.liveDetails.status] ||
    b.hasRaisedHand - a.hasRaisedHand ||
    b.isOnline - a.isOnline
);

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案2】:

    试试这个代码,我们根据您的要求根据元素的排序分数对数据进行排序。请注意,它们具有基于优先级的疮,即排序优先级标准越高,得分越高。每个排序标准之间的差距保持得很远,这样条件就不会重叠。如果条件增加,我们将更改分数类型增量。检查这个:

    function getScore(a) {
      var n = a.isTyping ? 30 : 0;
      n += a.liveDetails.status == 'active' ? 15 : 0;
      n += a.liveDetails.status == 'pending' ? 14 : 0;
      n += a.hasRaisedHand ? 8 : 0;
      n += a.isOnline ? 2 : 0;
      return n;
    }
    
    var results = data.sort((a, b) => getScore(a) < getScore(b));
     
    console.log(results);
    

    【讨论】:

      猜你喜欢
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多