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]);
    }
}