我从json文件中获取信息,并且试图订购asc和desc。到目前为止,这是我的代码:
$scope.fromLessToMore = function(){
var filteringBy = [];
$http.get('/app/json/file.json')
.then(function(data){
$scope.listOfProducts = data.data.products;
for(var i = 0; i< $scope.listOfProducts.length; i++){
if($scope.listOfProducts[i].id === $scope.inside){
filteringBy.push($scope.listOfProducts[i]);
}
}
//$scope.normalData = filteringBy;
$scope.dataOnFilter = filteringBy.sort((a, b) => (a.price > b.price) ? 1 : ((b.price > a.price) ? -1 : 0));
});
}
如您所见,我使用的是filteringBy.sort((a, b) => (a.price > b.price) ? 1 : ((b.price > a.price) ? -1 : 0));
,但是它的编号顺序如下:
$ 1,$ 100,$ 1000,$ 2,$ 200,$ 3,$ 30
我该怎么做才能正确订购($ 1,$ 2,$ 3,$ 30 ...)?我已经尝试使用ES6:filteringBy.sort((a,b) => a.price - b.price);
和filteringBy.sort((a,b) => a - b.price);
,但无法正常工作,并且在控制台上没有任何错误。
有人可以帮助我吗?
我正在使用AngularJs和Javascript。
答案 0 :(得分:2)
我不鼓励这样的排序,但是您可以使用\D
替换非摘要值,然后应用排序。
filteringBy = ['$1', '$100', '$1000', '$2', '$200', '$3', '$30'];
var filtered = filteringBy.sort((a, b) => {
var aPrice = parseInt(a.replace(/\D/g,''));
var bPrice = parseInt(b.replace(/\D/g,''));
return (aPrice > bPrice) ? 1 : ((bPrice > aPrice) ? -1 : 0)
});
console.log(filtered);
您应该尝试使用数据库自身的整数。
答案 1 :(得分:0)
您当前的值是字符串,并且字符串是按照每个字符进行比较的,所以当前的排序是正确的。要获得排序顺序,您需要考虑将其解析为Numbers fist:
// The slice removes the dollar sign
filteringBy = filteringBy.map((a) => Number.parseFloat(a.slice(1)));
答案 2 :(得分:0)
由于您的内容为字符串/货币格式,因此您需要将货币/字符串转换为数字,然后对其进行排序。我们可以做下面的事情,
filteringBy = [{price:'$10'},{price:'$110'},{price:'$20'},{price:'$30'}, {price:'$510'}];
filteringBy.sort((a, b) => (Number(a.price.replace('$','')) > Number(b.price.replace('$', ''))) ? 1 : ((Number(b.price.replace('$','')) > Number(a.price.replace('$',''))) ? -1 : 0));