Как отсортировать объект json по целочисленному столбцу типа «3», «2», «5» - PullRequest
0 голосов
/ 26 декабря 2018

Я хочу отсортировать объект json, столбец которого содержит числа.Но сортировка некорректна, потому что столбец имеет строковый тип.Как я могу отсортировать строковые числа по порядку номеров?

var myArray = [{
  name: 'David',
  total: "6"
}, {
  name: 'John',
  total: "2"
}, {
  name: 'Joe',
  total: "8"
}, {
  name: 'Ana',
  total: "14"
}];

var ascending;
var descending;

function test1() {
  ascending = _.sortBy(myArray, 'total');
  console.log(JSON.stringify(ascending));
}

function test2() {
  descending = ascending.reverse();
  console.log(JSON.stringify(descending));

}
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.4/lodash.min.js"></script>
<button onclick="test1()">Ascending</button>
<button onclick="test2()">Descending</button>

Ответы [ 7 ]

0 голосов
/ 26 декабря 2018

Реализуйте, как показано ниже, для сортировки по свойству "total" -

function getSortOrder(prop) {  
    return function(a, b) {  
        if (parseInt(a[prop]) > parseInt(b[prop])) {  
            return 1;  
        } else if (parseInt(a[prop]) < parseInt(b[prop])) {  
            return -1;  
        }  
        return 0;  
    } 
}
array.sort(getSortOrder("total")); 
0 голосов
/ 26 декабря 2018

Вы можете использовать _.orderBy

var myArray = [{"name":"David","total":"6"},{"name":"John","total":"2"},{"name":"Joe","total":"8"},{"name":"Ana","total":"14"}];

var ascending;
var descending;

function test1() {
  ascending = _.orderBy(myArray, v => parseInt(v.total),['asc']);
  console.log(JSON.stringify(ascending));
}

function test2() {
  descending = _.orderBy(myArray, v => parseInt(v.total),['desc']);
  console.log(JSON.stringify(descending));

}
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.4/lodash.min.js"></script>
<button onclick="test1()">Ascending</button>
<button onclick="test2()">Descending</button>
0 голосов
/ 26 декабря 2018

Нет необходимости в loadlash, просто используйте .sort().взгляните на фрагмент

var myArray = [{
  name: 'David',
  total: "6"
}, {
  name: 'John',
  total: "2"
}, {
  name: 'Joe',
  total: "8"
}, {
  name: 'Ana',
  total: "14"
}];

var ascending;
var descending;

function test1() {
  ascending = myArray.sort(function(a,b){
          return Number(a.total) - Number(b.total);
  });
  console.log(ascending)
}

function test2() {
  descending = myArray.sort(function(a,b){
          return Number(b.total) -  Number(a.total);
  });
  console.log(descending);

}
<button onclick="test1()">Ascending</button>
<button onclick="test2()">Descending</button>
0 голосов
/ 26 декабря 2018

var myArray = [{
  name: 'David',
  total: "6"
}, {
  name: 'John',
  total: "2"
}, {
  name: 'Joe',
  total: "8"
}, {
  name: 'Ana',
  total: "14"
}];

var ascending;
var descending;

/**
 * Ascending
 * Calls the sort function of the Array object.
 * - Processed the "total" property of each object.
 * -- Parsing each string number into a int for comparision.
 */
function test1() {
  ascending = myArray.sort(function(a, b) { return parseInt(a['total']) > parseInt(b['total']); });
  console.log(JSON.stringify(ascending));
}

/**
 * Descending
 * Calls the sort function of the Array object.
 * - Processed the "total" property of each object.
 * -- Parsing each string number into a int for comparision.
 */
function test2() {
  descending = myArray.sort(function(a, b) { return parseInt(a['total']) < parseInt(b['total']); });
  console.log(JSON.stringify(descending));

}
<button onclick="test1()">Ascending</button>
<button onclick="test2()">Descending</button>
0 голосов
/ 26 декабря 2018

Используйте карту для создания нового массива, где значение total будет числом.Затем используйте функцию сортировки.

Следующая функция сортирует массив в порядке возрастания

var myArray = [{
  name: 'David',
  total: "6"
}, {
  name: 'John',
  total: "2"
}, {
  name: 'Joe',
  total: "8"
}, {
  name: 'Ana',
  total: "14"
}];

let sortedOrder = myArray.map((item) => {
  return {
    name: item.name,
    total: parseInt(item.total, 10)
  }
}).sort((a, b) => {
  return a.total - b.total;
})
console.log(sortedOrder)
0 голосов
/ 26 декабря 2018

Вы можете сделать это следующим образом

Здесь для сравнения sort мы должны изменить строку на число.

var myArray = [{
  name: 'David',
  total: "6"
}, {
  name: 'John',
  total: "2"
}, {
  name: 'Joe',
  total: "8"
}, {
  name: 'Ana',
  total: "14"
}];

var ascending;
var descending;

function test1() {
  ascending = myArray.sort((a,b)=>Number(a.total)-Number(b.total));
  console.log(JSON.stringify(ascending));
}

function test2() {
  descending = ascending.reverse();
  console.log(JSON.stringify(descending));

}
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.4/lodash.min.js"></script>
<button onclick="test1()">Ascending</button>
<button onclick="test2()">Descending</button>
0 голосов
/ 26 декабря 2018

Используйте _.sortBy() с обратным вызовом и конвертируйте total в число:

var myArray = [{"name":"David","total":"6"},{"name":"John","total":"2"},{"name":"Joe","total":"8"},{"name":"Ana","total":"14"}];

var ascending;
var descending;

function test1() {
  ascending = _.sortBy(myArray, v => Number(v.total));
  console.log(JSON.stringify(ascending));
}

function test2() {
  descending = ascending.reverse();
  console.log(JSON.stringify(descending));

}
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.4/lodash.min.js"></script>
<button onclick="test1()">Ascending</button>
<button onclick="test2()">Descending</button>
...