基于条件的JavaScript排序数组

时间:2016-11-06 14:01:06

标签: javascript sorting

如果我有一系列以下项目,我想显示先排序的所有IsImportant=true项目,然后显示排序的IsImportant=false项目。

var sampleArray = [{
  "Name": "A",
  "IsImportant": true
}, {
  "Name": "B",
  "IsImportant": true
}, {
  "Name": "C",
  "IsImportant": false
}, {
  "Name": "D",
  "IsImportant": false
}, {
  "Name": "E",
  "IsImportant": false
},, {
  "Name": "F",
  "IsImportant": true
},
, {
  "Name": "G",
  "IsImportant": true
}, {
  "Name": "H",
  "IsImportant": false
}];

我试图写下面的compareFunction来达到结果,但没有成功。会有更好的选择吗?

function comparator(a, b) {
  //console.log(a,b); 
  if (a.IsImportant || b.IsImportant) {
    if (a.Name > b.Name) {
      return 1;
    }
    if (a.Name < b.Name) {
      return -1;
    }
  }
  return 0;
};

Fiddle

2 个答案:

答案 0 :(得分:2)

你要做的是对2个键进行排序:首先,&#34; IsImportant&#34;键,第二,名字。比较器应按顺序检查每个键,并在高优先级键相等时仅移动到后续键。

因此:

function comparator(a, b) {
  //console.log(a,b); 
  if (a.IsImportant && !b.IsImportant)
    return 1;

  if (!a.IsImportant && b.IsImportant)
    return -1;

  return a.Name.localeCompare(b.Name);
};

.localeCompare()函数是比较字符串进行排序的便捷方法。)

您可以利用这样一个事实:当它们与(truefalse一起使用时,它会将布尔常量10视为function comparator(a, b) { var diff = b.IsImportant - a.IsImportant; if (diff) return diff; return a.Name.localeCompare(b.Name); } index )数学运算符,所以你可以缩短一点:

$(document).ready(function(){
  var index = 0
  $("#rad-btn").click(function(){
    index++
    $("#rad-spin").css("transform", "rotate(" + 90 * index + "deg)");
  });
});

无论哪种方式,当&#34; IsImportant&#34;时,比较器都不会比较名称。国旗是不同的。如果这两个标志对于要比较的两个项都是真或假,则然后检查名称。这样,您将按名称顺序获取所有重要的,然后是所有其他重要的。

答案 1 :(得分:0)

为什么不呢:

&#13;
&#13;
<tr>
&#13;
&#13;
&#13;