Lodash没有正确排序对象

时间:2018-03-04 12:15:54

标签: javascript arrays object lodash

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

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]应该是Apple,因为它的价格最高,但事实并非如此。 可能有什么不对?

4 个答案:

答案 0 :(得分:0)

每个人都提到你正在对字符串进行排序,所以你的结果不是你所期望的。要根据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);

答案 1 :(得分:0)

由于这里没有使用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>

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

如果您使用的是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");`