如果我有一个包含以下项目的数组,并且我想显示首先排序的所有 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;
};
最佳答案
您想要做的是按 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 常量 true
和 false
视为 1
和 0
的事实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/