[英]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会将布尔常量true
和false
视为1
和0
,因此可以将其缩短一点:
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.