使用.sort从数组asc或desc排序数据

时间:2018-11-19 04:33:11

标签: javascript angularjs

我从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。

3 个答案:

答案 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));