javascript - 如何对不同属性执行自定义主干排序?

标签 javascript sorting backbone.js backbone.js-collections

我正在尝试执行以下操作。考虑到这一点,我想对一些棒球运动员进行排序。经理应该位于顶部(按活跃然后名称排序),然后我想对玩家或任何其他类型进行排序 - 可能是按活跃然后名称排序其他几种类型。

最重要的是,我在名称上使用了不区分大小写的自然排序。

这是一个示例列表:

[
    {type: 'manager', name: 'Michael A', active: true},
    {type: 'player', name: 'Abraham B', active: true},
    {type: 'player', name: 'Jason R', active: false},
    {type: 'manager', name: 'John A', active: true},
    {type: 'coach', name: 'Ron A', active: true},
    {type: 'player', name: 'Bobby A', active: false},
    {type: 'player', name: 'Bobby J', active: true}
]

对这些进行排序应该产生:

[
    {type: 'manager', name: 'Michael A', active: true},
    {type: 'manager', name: 'John A', active: true},

    {type: 'player', name: 'Abraham B', active: true},
    {type: 'player', name: 'Bobby J', active: true}
    {type: 'coach',  name: 'Ron A', active: true},
    {type: 'player', name: 'Bobby A', active: false},
    {type: 'player', name: 'Jason R', active: false},
]

我尝试过的一件事是 case 语句,但我不知道如何进行下一级排序(名称和事件)

    comparator: function(person) {
        switch (person.get('type')) {
            case 'manager': return 1;
            default: return 2;
        }
    }

最佳答案

通常你会使用||运算符来指定排序顺序。但是,就您而言,基于条件的排序顺序不适用。你不是明确地排序,而是像蛋糕一样分层排序。所以你需要修改你的排序函数。

var list = [{
    type: 'manager',
    name: 'Michael A',
    active: true
  },
  {
    type: 'player',
    name: 'Abraham B',
    active: true
  },
  {
    type: 'player',
    name: 'Jason R',
    active: false
  },
  {
    type: 'manager',
    name: 'John A',
    active: true
  },
  {
    type: 'coach',
    name: 'Ron A',
    active: true
  },
  {
    type: 'player',
    name: 'Bobby A',
    active: false
  },
  {
    type: 'player',
    name: 'Bobby J',
    active: true
  }
]

list.sort(function(a, b) {
  return compareActive(a, b) || compareType(a, b) || compareNames(a, b);
});

function compareActive(a, b) {
  if (a.active === b.active) {
    return 0;
  } else if (a.active === true) {
    return -1;
  } else {
    return 1
  }
};

function compareNames(a, b) {
  return a.name.localeCompare(b.name);
};

function compareType(a, b) {
  if (a.type === b.type) {
    return 0;
  } else if (b.type === 'manager') {
    return 1;
  } else if (a.type === 'manager') {
    return -1;
  } else {
    return 0
  }
}
console.log(list);

关于javascript - 如何对不同属性执行自定义主干排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44554917/

相关文章:

java - 按字母顺序对 JSONArray 进行排序(单值)

jQuery 日期排序 li div 浏览器问题

javascript - 从模型获取属性并在模板中显示它 - Backbone

javascript - 用 Pubnub 替换 Socket io (WebRTC)

javascript - webdriverIO - 未处理的 promise 拒绝 : NoSuchSessionError: invalid session id

javascript - 如何为ONSEN页面加载添加js函数? (莫纳卡)

javascript - Backbone.js JSON 结构

javascript - 使用 MeteorJS 制作 API

java - 如何筛选其中包含 WebElement 的列表

backbone.js - Backbone/Underscore 链方法与 where 方法