繁体   English   中英

基于条件的JavaScript排序数组

[英]JavaScript Sorting Array Based On Condition

如果我有以下项目的数组,并且我想显示所有首先排序的IsImportant=true项,然后再IsImportant=false接下来排序的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;
};

小提琴

您尝试做的是按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与(某些)数学运算符一起使用时,JavaScript会将布尔常量truefalse视为10 ,因此可以将其缩短一点:

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

无论哪种方式,当“ IsImportant”标志不同时,比较器都不会费心去比较名称。 当这两个标志是真或假的两个项目进行比较, 然后将名称检查。 这样,您将首先按名称顺序获取所有重要的信息,然后再获取所有其他重要的信息。

为什么不这样:

 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 }]; var results = sampleArray.filter(x => x.IsImportant).concat(sampleArray.filter(x => !x.IsImportant)); console.log(results); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM