UnderscoreJs:对象sortBy具有空属性

时间:2016-01-07 14:12:02

标签: sorting underscore.js lodash

问题是,我想按价格对可能包含空属性的用户数组进行排序:

var array =  [
    {
      "created": "2015-11-27T16:33:46.781Z",
      "name": "Johan",
      "pricing": {
        "base_price" : "12",
        "price_by_hour" : "5"
      }
    },
    {
      "created": "2015-11-27T16:33:46.781Z",
      "name": "Marco"
    },
    {
      "created": "2015-11-27T16:33:46.781Z",
      "name": "Jane",
      "pricing": {
        "base_price" : "8",
        "price_by_hour" : "11"
      }
    }
 ];

array = _.sortBy(array, function(item) {
    return item.pricing.base_price;
});

的console.log(数组);

TypeError: Cannot read property 'base_price' of undefined

如何将没有定价对象的项目放在我的列表底部并仍然对其进行排序?

在这种情况下,我想首先用Jane排序,然后是Johan,然后是Marco。

4 个答案:

答案 0 :(得分:3)

只需加上条件

array = _.sortBy(array, function(item){
    if(item.pricing){
       return item.pricing.base_price;
    }
});

答案 1 :(得分:3)

这是一种简单的方法:

_.sortBy(array, 'pricing.base_price');

当您将字符串作为iteratee传递给sortBy()时,将使用property()函数。此函数适用于属性路径,如果属性不存在,则只返回undefined

答案 2 :(得分:1)

好的,如果属性为空,我只需要返回false:

array = _.sortBy(array, function(item) {
    if(!item.pricing || !item.pricing.base_price){
         return -1;
    }
    return item.pricing.base_price;
});

答案 3 :(得分:1)

您需要有条件才能避免获得TypeError。您还需要将base_price投射到Number以获得正确的排序。

array = _.sortBy(array, function(item){
    if(item.pricing){
       return Number(item.pricing.base_price);
    }
});

一种替代方案是将Number初始化为它们。

var array =  [
    {
      "created": "2015-11-27T16:33:46.781Z",
      "name": "Johan",
      "pricing": {
        "base_price" : 12,
        "price_by_hour" : 5
      }
    },
    {
      "created": "2015-11-27T16:33:46.781Z",
      "name": "Marco"
    },
    {
      "created": "2015-11-27T16:33:46.781Z",
      "name": "Jane",
      "pricing": {
        "base_price" : 8,
        "price_by_hour" : 11
      }
    }
 ];

array = _.sortBy(array, function(item) {
    if(item.pricing){
       return item.pricing.base_price;
    }
});