【问题标题】:Sort array based on presence of fields in objects根据对象中字段的存在对数组进行排序
【发布时间】:2019-06-22 14:25:38
【问题描述】:

如果缺少任何字段,我如何对数组进行排序?

所以现有的数组例如是:

const users = [
    {
        id: 1, firstname: 'Jerry'
    }, {
        id: 2, firstname: 'Thomas', lastname: 'Geib'
    }, {
        id: 3
    }, {
        id: 4, lastname: 'Berg'
    }, {
        id: 5, firstname: 'Ass', lastname: 'Noob'
    }, {
        id: 6, lastname: 'Jopa'
    }
]

并且结果应该按这个顺序排序:

  1. 具有firstnamelastname 的对象
  2. 对象仅具有firstnamelastname
  3. 没有firstnamelastname 的对象

所以它看起来像:

    const users = [
        {
            id: 2, firstname: 'Thomas', lastname: 'Geib'
        }, {
            id: 5, firstname: 'Ass', lastname: 'Noob'
        }, {
            id: 1, firstname: 'Jerry'
        }, {
            id: 4, lastname: 'Berg'
        }, {
            id: 6, lastname: 'Jopa'
        }, {
            id: 3
        }
    ]

我已经尝试过这种排序,但结果不是我需要的

users.sort((a,b) => {
    if (a.firstname === b.firstname) {
        return 0
    }
    if (!a.firstname) {
        return 1
    }
    return -1
});

【问题讨论】:

  • 您根据什么对对象进行排序?
  • 我猜的姓
  • 我认为最少的对象字段值是数组中的最后一个
  • 对不起,我真的没有发短信。我编辑了问题
  • @hofshteyn 您的编辑仍然没有说明如果 2 个用户同时拥有 firstnamelastname 会发生什么?

标签: javascript arrays sorting object ecmascript-6


【解决方案1】:

您可以通过检查属性是否存在进行排序。最后按id升序排序。

const users = [{ id: 1, firstname: 'Jerry' }, { id: 2, firstname: 'Thomas', lastname: 'Geib' }, { id: 3 }, { id: 4, lastname: 'Berg' }, { id: 5, firstname: 'Ass', lastname: 'Noob' }, { id: 6, lastname: 'Jopa' }];

users.sort((a, b) => 
    ('firstname' in b && 'lastname' in b ) - ('firstname' in a && 'lastname' in a) ||
    ('firstname' in b) - ('firstname' in a) ||
    ('lastname' in b) - ('lastname' in a) ||
    a.id - b.id
);

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

【讨论】:

    【解决方案2】:

    好吧,只需计算每个项目的属性数量,然后按此数字降序排列:

    var users = [
      {id: 1,firstname: 'Jerry'}, 
      {id: 2,firstname: 'Thomas', lastname: 'Geib'}, 
      {id: 3}, 
      {id: 4,lastname: 'Berg'}, 
      {id: 5,firstname: 'Ass',lastname: 'Noob'}, 
      {id: 6,lastname: 'Jopa'}
    ];
    users.sort(function(a, b) {
      var aw = ('firstname' in a) + ('lastname' in a);
      var bw = ('firstname' in b) + ('lastname' in b);
      return bw - aw;
    });
    console.log(users);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 2013-11-25
      • 2018-12-27
      • 2011-05-16
      相关资源
      最近更新 更多