Underscore Js:对象排序为空属性

UnderscoreJs : objects sortBy with empty attributes

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

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

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

在这种情况下,我想首先对列表进行排序,Jane,然后是 Johan,然后是 Marco。

就放个条件

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

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

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

您需要一个条件来避免获得 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;
    }
});

这是一个简单的方法:

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

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