Javascript JS |当并非所有属性都存在时,按属性对对象数组进行排序
在以下代码中:Javascript JS |当并非所有属性都存在时,按属性对对象数组进行排序,javascript,arrays,sorting,object,Javascript,Arrays,Sorting,Object,在以下代码中: function by(param) { return function(a,b) { if (parseInt(a[param]) < parseInt(b[param])) return -1; if (parseInt(a[param]) > parseInt(b[param])) return 1; return 0; } } var data = [{ dogs: 3, ca
function by(param) {
return function(a,b) {
if (parseInt(a[param]) < parseInt(b[param]))
return -1;
if (parseInt(a[param]) > parseInt(b[param]))
return 1;
return 0;
}
}
var data = [{
dogs: 3,
cats: 2,
fish: 14
},{
dogs: 30,
cats: 5
},{
dogs: 7,
cats: 8,
fish: 1
},{
dogs: 0,
cats: 8
}];
console.log(data.sort(by("fish")));
现在我知道当属性未定义时会发生一些事情,但是我不确定如何处理它
小提琴:这应该可以用了:。我用减法代替if,因为它更快更干净
function by(param) {
return function(a,b) {
var vala = typeof a[param] == 'undefined' ? Infinity : parseInt(a[param]);
var valb = typeof b[param] == 'undefined' ? Infinity : parseInt(b[param]);
return vala-valb;
}
}
如果希望在末尾缺少属性,可以使用无穷大;如果希望在开头缺少属性,可以使用-Infinity
如果您想增加订单,可以使用vala valb,如果您想减少订单,可以使用valb vala
您可以混合使用前两条语句来获得所需的排序方式。这可以使用这个小助手函数非常习惯地编写:
function cmp(x, y) { return x > y ? 1 : x < y ? -1 : 0 }
美丽的想法!然而,尽管你可以把它放在数组的末尾或开头,排序本身将始终是降序的哦,明白了吗?无穷大可以颠倒整个过程-太棒了!谢谢你的回答,我没有选择它,因为它使用了一个额外的函数,这是可以避免的,因为基本上helper函数控制排序本身,所以它有点难获得。这显然是一个很好的解决方案
function cmp(x, y) { return x > y ? 1 : x < y ? -1 : 0 }
function by(param) {
return function(a, b) {
return cmp(param in b, param in a) || cmp(a[param], b[param]);
}
}