【问题标题】:JS | Sort An array of object by property when not all properties are presentJS |当并非所有属性都存在时,按属性排序对象数组
【发布时间】:2013-11-26 09:50:22
【问题描述】:

在以下代码中:

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")));

您可以看到并非所有对象都具有所有属性。我需要做的是按顺序对这些对象进行排序,首先选择的参数值按它们的顺序排序,然后其余的,但是,收到的输出是:

0: Object
cats: 2
dogs: 3
fish: 14
__proto__: Object
1: Object
cats: 5   //this shouldn't be here since it doesn't contain 'fish'
dogs: 30
__proto__: Object
2: Object
cats: 8
dogs: 7
fish: 1
__proto__: Object
3: Object
cats: 8
dogs: 0

现在我知道当属性未定义时会发生一些事情,但是我不确定如何处理它。

小提琴:http://jsfiddle.net/wffNn/

【问题讨论】:

    标签: javascript arrays sorting object


    【解决方案1】:

    这应该可以工作:http://jsfiddle.net/wffNn/1/。我使用减法而不是 if 因为它更快更清洁 IMO

    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,如果您希望在开头使用 -Infinity。

    如果你想增加顺序,你可以使用 vala-valb 或 valb-vala 减少顺序。

    您可以混合前两个语句来获得您想要的排序方式。

    【讨论】:

    • 美丽的想法!但是,尽管您可以将其放在数组的末尾或开头,但排序本身将始终按降序排列
    • 哦,明白了 - -Infinity 可以逆转整个事情 - 太棒了!
    【解决方案2】:

    这可以用这个小辅助函数非常地道地写出来:

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

    【讨论】:

    • 感谢您的回答,我没有选择它,因为它使用了一个可以避免的额外功能,因为基本上辅助功能控制排序本身,所以它有点难以获得。这显然是一个很好的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 2012-02-20
    相关资源
    最近更新 更多