2017-02-13 34 views
1

我有一个对象数组,我想通过几个属性来排序。自定义array.sort函数与几个标准包括。布尔值

Im去展示阵列的单个元件

var ele = { 
    id: INT, various, 
    priority: INT 1 - 10, 
    shooterid: INT various, 
    targetid: INT various, 
    flight: BOOL 
} 

我想根据某些标准来命令阵列,我可以通过使用

if (a.priority != b-priority){ 
    return a-priority - b-priority; 
else if a.shooterid != b.shooterid){ 
    return a.shooterid - b. shooterid 
} 
else return a.targetid - b.targetid 
执行排序的优先级,射手和目标

但是,我也想通过航班进行排序,我想与flight = true所有元素将在除了上述排序LAST排序。

我试图if (a.flight){return -1/0/1}一个以上的最顶端,如果/自(添加其他的前身是如果),但它没有工作......

如何延长排序以包括BOOL道具?

+2

请添加一些小样本数据。 –

+0

只要做'飞行'比较你做的第一件事。如果“飞行”属性不同,那么没有其他问题。你说“没有”工作,但它会*工作;描述出了什么问题,否则没有人能真正帮助你。 – Pointy

+1

你真的试过代码'return -1/0/1'吗?这是消极的'无限'(负数除以零除) - 是你想要的吗?或者你的意思是你单独尝试了每个值,而没有发挥作用? – apsillers

回答

2

您可以将所有排序条件与逻辑或||结合起来,即使是布尔值。

var data = [{ id: 0, flight: true, priority: 1, shooterid: 2, targetid: 1 }, { id: 1, flight: true, priority: 2, shooterid: 2, targetid: 3 }, { id: 2, flight: false, priority: 1, shooterid: 1, targetid: 2 }, { id: 3, flight: false, priority: 2, shooterid: 1, targetid: 1 }, { id: 4, flight: true, priority: 1, shooterid: 1, targetid: 2 }]; 
 

 
data.sort(function (a, b) { 
 
    return (
 
     a.flight - b.flight || 
 
     a.priority - b.priority || 
 
     a.shooterid - b.shooterid || 
 
     a.targetid - b.targetid 
 
    ); 
 
}); 
 

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

1

第一if应该是:

if (a.flight != b.flight) 
    return a.flight - b.flight; 

在减法,布尔true1false作为0处理。这意味着false将按true排序,正如你所说的那样。

+0

感谢您的回答。我决定批准其他答案,因为它看起来很干净||而不是if/else。不过,我感谢你对推理的解释。 – user431806