根据带有空值的多个条件对对象数组排序
Sorting an array of objects by multiple criteria with null values
好了,我有一个对象数组,其中包含某个属性的空值
对象看起来大致像这样的排序目的…(40个元素,但这就足够了…)。
需要按照roulette
降序排序(roulette
有时为空),然后是novelty
,然后是popularity
。
我的头有点碎了。
这可以按降序对roulette
进行排序,但是我需要如何扩展它以包括其他两个标准?
[
{
title: 'one',
popularity: 4,
novelty: 3
},
{
title: 'two',
popularity: 1
novelty: 4
},
{
title: 'three',
popularity: 5,
novelty: 3,
roulette: 0
},
{
title: 'four',
popularity: 5,
novelty: 3,
roulette: 1
}
]
部分工作功能:
object.sort(function(a, b) {
if (a['roulette'] == null) return 1
if (b['roulette'] == null) return -1
if (a['roulette'] === b['roulette']) return 0
return b.roulette > a.roulette ? 1 : -1
});
尝试使用优先级和组进行排序。
var data = [{ title: 'one', popularity: 4, novelty: 3 }, { title: 'two', popularity: 1, novelty: 4 }, { title: 'three', popularity: 5, novelty: 3, roulette: 0 }, { title: 'four', popularity: 5, novelty: 3, roulette: 1 }, { title: 'five', popularity: 5, novelty: 4, roulette: null }, { title: 'six', popularity: 5, novelty: 5, roulette: undefined }];
data.sort(function (a, b) {
return (
(a.roulette === undefined || a.roulette === null) - (b.roulette === undefined || b.roulette === null) ||
a.roulette - b.roulette ||
a.novelty - b.novelty ||
a.popularity - b.popularity
);
});
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }
您可以尝试基于加权排名的排序:
var data=[{title:"one",popularity:4,novelty:3},{title:"two",popularity:1,novelty:4},{title:"three",popularity:5,novelty:3,roulette:0},{title:"four",popularity:5,novelty:3,roulette:1}];
data.sort(function(a, b) {
var r1 = a.roulette === undefined ? -1 : a.roulette;
var r2 = b.roulette === undefined ? -1 : b.roulette;
var n1 = a.novelty === undefined ? -1 : a.novelty;
var n2 = b.novelty === undefined ? -1 : b.novelty;
var p1 = a.popularity === undefined ? -1 : a.popularity;
var p2 = b.popularity === undefined ? -1 : b.popularity;
var r_rank = r1 > r2 ? -100 : r1 < r2 ? 100 : 0;
var n_rank = n1 > n2 ? -10 : n1 < n2 ? 10 : 0;
var p_rank = p1 > p2 ? -1 : p1 < p2 ? 1 : 0;
return r_rank + n_rank + p_rank;
})
var r_rank = r1 > r2 ? -100 : r1 < r2 ? 100 : 0;
var n_rank = n1 > n2 ? -10 : n1 < n2 ? 10 : 0;
var p_rank = p1 > p2 ? -1 : p1 < p2 ? 1 : 0;
return r_rank + n_rank + p_rank;
})
console.log(data)
只需包含更多条件:
var data = [{"title":"one","popularity":4,"novelty":3},{"title":"two","popularity":1,"novelty":4},{"title":"three","popularity":5,"novelty":3,"roulette":0},{"title":"four","popularity":5,"novelty":3,"roulette":1}];
data.sort(function(a,b) {
if (a.roulette < b.roulette || a.roulette == null) return +1;
if (a.roulette > b.roulette || b.roulette == null) return -1;
if (a.novelty < b.novelty || a.novelty == null) return +1;
if (a.novelty > b.novelty || b.novelty == null) return -1;
if (a.popularity < b.popularity || a.popularity == null) return +1;
if (a.popularity > b.popularity || b.popularity == null) return -1;
return 0;
})
console.log(data);
如果一个参数相同,你只需要继续打破联系。
obj.sort(function(a, b) {
var rouletteDiff = compare(a.roulette, b.roulette);
if(rouletteDiff != 0) return rouletteDiff;
var noveltyDiff = compare(a.novelty, b.novelty);
if(noveltyDiff != 0) return noveltyDiff;
return compare(a.popularity, b.popularity);
});
function compare(x,y){
if(x == undefined) return 1;
if(y == undefined) return -1;
if(x === y){
return 0;
}else{
return x > y ? -1 : 1
}
}
这是roulette
, novelty
和popularity
(按顺序)的优先排序(降序)
这处理 null
和undefined
-查看下面的演示:
var object=[{title:"one",popularity:4,novelty:3},{title:"two",popularity:1,novelty:4},{title:"three",popularity:5,novelty:3,roulette:0},{title:"four",popularity:5,novelty:3,roulette:1},{title:"five",roulette:4,novelty:null},{title:"six",popuplarity:7},{title:"seven",novelty:8,roulette:null},{title:"eight",novelty:0},{title:"nine",popularity:10}];
function ifNumber(num) {
if(num == undefined || num == null)
return -Infinity;
else
return num;
}
var result = object.sort(function(a, b) {
return (ifNumber(b.roulette) - ifNumber(a.roulette))
|| (ifNumber(b.novelty) - ifNumber(a.novelty))
|| (ifNumber(b.popuplarity) - ifNumber(a.popuplarity));
});
console.log(result);
.as-console-wrapper{top:0;max-height:100%!important;}
相关文章:
- javascript对象操作:根据指定条件选择属性
- 在特定条件下从存储在localStorage中的阵列中删除对象
- “;Stub对象”;对象不符合检查点's条件
- 如果满足某些条件,我如何才能创建一个只有值的对象
- 如何在循环对象时有条件地使用数据
- 从 JSON 对象数组中获取与条件匹配的文档
- 在 JavaScript 中,如何有条件地向对象添加成员
- 根据条件选择JSon对象
- 使用restangular从json对象数组中获取具有特定条件的json对象
- 如何按条件删除对象中的对象
- Javascript:当属性可能不存在时,在对象中使用OR条件
- 根据条件从数组中删除对象
- 如何将特定json对象的值与几个条件相加(例如,对象“TYPE”的值为“ABC”)
- 根据JavaScript中的条件将对象拆分为对象数组
- Javascript-在检查对象属性是否存在时避免异步竞争条件
- 使用具有特定条件的 lodash 添加和组合对象数组中的重复项
- 根据某些条件将 JS 绑定到可观察对象内的数组元素
- 如何处理 JavaScript 条件语句中的可为空的对象
- 添加新对象时的循环和条件
- 如何通过指定条件来访问 javascript 对象