【问题标题】:Lodash does not sort objects correctlyLodash 无法正确排序对象
【发布时间】:2018-03-04 12:15:54
【问题描述】:

我正在尝试根据其属性(价格)对对象进行排序

var arr = [{
        name: 'Apple',
        price: '1.03'
    },
    {
        name: 'Cherry',
        price: '0.33'
    },
    {
        name: 'Mango',
        price: '0.53'
    }
]

现在我使用 lodash 按价格对其进行排序:

arr = _.sortBy(arr, 'price' ).reverse();

现在arr[0] 应该是苹果,因为它的价格最高,但不是。 有什么问题?

【问题讨论】:

  • 由于price 是您数组中的一个字符串,您可能会得到一些意想不到的结果。
  • 我想 Lodash 使用的是字母排序而不是数字排序,因为您的 price 字段是字符串而不是数字。
  • @MohammadUsman 是对的,但我得到的结果非常正确.. jsfiddle.net/L7y9kbhh/4
  • 这个stackoverflow.com/questions/979256/… 可能对你有帮助
  • 不知道你为什么使用 lodash,在 POJS 中:arr.sort((a,b) => b.price - a.price)(对于最低索引的最高值)。

标签: javascript arrays object lodash


【解决方案1】:

正如每个人都提到的那样,您正在对字符串进行排序,因此您的结果不是您所期望的。要根据price 进行排序,请使用以下(或类似的):

var arr = [{
        name: 'Apple',
        price: '1.03'
    },
    {
        name: 'Cherry',
        price: '0.33'
    },
    {
        name: 'Mango',
        price: '0.53'
    }
]

arr.sort(function(a, b){
	return parseFloat(b.price) - parseFloat(a.price);
});

console.log(arr);

【讨论】:

    【解决方案2】:

    由于这里没有使用 Lodash 的答案,我将提供一个以防其他人将来偶然发现这个问题:

    // Your code:
    var arr = [{
            name: 'Apple',
            price: '1.03'
        },
        {
            name: 'Cherry',
            price: '0.33'
        },
        {
            name: 'Mango',
            price: '0.53'
        }
    ]
    
    // Yours that isn't working:
    // arr = _.sortBy(arr, 'price' ).reverse();
    
    const sortedArr = _.chain(arr)
      .map((val) => _.toNumber(val.price))
      .sortBy()
      .value();
      
    console.log(sortedArr);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>

    【讨论】:

      【解决方案3】:

      由于每个对象内的price 值是一个字符串,因此您会得到不同的结果。您可以利用函数回调并将您的price 值转换为数字,并使用sortBy 根据price 的数值对数据进行排序。

      var arr = [{name: 'Apple',price: '1.03'},{name: 'Cherry',price: '0.33'},{name: 'Mango',price: '0.53'}];
      _.sortBy(arr, ({price}) => +price);
      console.log(arr);
      <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>

      【讨论】:

        【解决方案4】:

        如果您使用的是 LoDash,我就是这样做的:

        var arr = [{name: 'Apple',price: '1.03',weight:'12'},{name: 'Cherry',price: '0.33', 
        weight:'12',weight:'12'},{name: 'Mango',price: '0.53',weight:'12'}];
        
        SortyBy(sortName, SortType, order)
        {
        
          if(SortType == 1)
          {
               _.orderBy(arr,[function(o) { return parseFloat(o[sortName]); }],order);
          }
          else
          {
              _.orderBy(arr,[function(o) { return o[sortName]; }], order);
          }
        }
        
        //you would then call:
        SortBy("price",1, "asc");
        SortBy("weight",1, "asc");
        SortBy("name",0,"desc");`
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-21
          • 2019-12-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多