JavaScript 根据条件对数组进行排序

标签 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 个键进行排序:第一个是“IsImportant”键,第二个是名称。比较器应按顺序检查每个键,并且仅在较高优先级的键相等时才转到后续键。

因此:

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() 函数是比较字符串进行排序的便捷方法。)

您可以利用 JavaScript 会将 bool 常量 truefalse 视为 10 的事实code> 当它们与(某些)数学运算符一起使用时,因此您可以稍微缩短它:

function comparator(a, b) {
  var diff = b.IsImportant - a.IsImportant;
  if (diff) return diff;
  return a.Name.localeCompare(b.Name);
}

无论哪种方式,当“IsImportant”标志不同时,比较器都不会比较名称。当所比较的两个项目的两个标志都为 true 或 false 时,然后将检查名称。这样,您将首先按名称顺序获得所有重要的内容,然后是所有其他重要的内容。

关于JavaScript 根据条件对数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40450167/

相关文章:

python - 按条件条件对列表进行排序

c - (C程序)随机数数组程序,并按升序排序,然后求中位数

javascript - 启用非事件字段的复选框

javascript - 单击元素时获取索引,然后传递该索引以触发另一个事件

与新日期相比,javascript getTime() 为旧日期返回更大的值

javascript - 在javascript中选择第一个div child 的第二个 child

javascript - 按英国日期对 jQuery 数据表进行排序并忽略空单元格

ios - 排序数组字母数字 Swift3

algorithm - 在 O(n) 时间和 O(1) 额外空间内将 3 个 BST 排序到一个数组

javascript - jQuery 错误 : Object doesn't support property or method 'addEventListener'