Упорядочить данные из массива asc или desc с помощью .sort - PullRequest
0 голосов
/ 19 ноября 2018

Я получаю информацию из файла 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 голосов
/ 19 ноября 2018

Я не поощряю сортировку таким образом, но вы можете заменить нецифровые значения, используя \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);

Вы должны попробовать использовать целое число из базы данных само.

0 голосов
/ 19 ноября 2018

Поскольку ваше содержимое представлено в формате строка / валюта, вам необходимо преобразовать валюту / строку в число, а затем отсортировать их.мы можем сделать что-то вроде ниже,

    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));
0 голосов
/ 19 ноября 2018

Ваши текущие значения являются строковыми, и строки сравниваются по каждому символу, поэтому текущие сортировки верны. Для достижения порядка сортировки вам нужно рассмотреть их как Числа кулак:

// The slice removes the dollar sign
filteringBy = filteringBy.map((a) => Number.parseFloat(a.slice(1)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...