Не могу отсортировать массив, содержащий int - PullRequest
0 голосов
/ 10 января 2020

Я не могу отсортировать массив, содержащий int. Вот мой код для сортировки:

var asr = [];

function sortNumber(a, b) {
  return b - a;
}
asr.sort(sortNumber);

Функция sort ничего не делает, вот пример моего массива, когда я сделал console.log(asr) для chrome:

по: 3
de: 2
ds: 14
sr: 2
vi: 1

proto : Array (0)

Ответы [ 3 ]

3 голосов
/ 10 января 2020

Судя по вашему недавнему обновлению, asr - это массив с добавленными вами свойствами. Как правило, это не очень хорошая идея, если вы не знаете, что делаете, и sort() не будет касаться этих свойств.

Вместо этого я бы использовал обычный объект с предупреждением об объектах в JavaScript на самом деле не должны содержать упорядоченную коллекцию значений. С учетом этого предостережения, я буду хранить данные и сортировать ключи:

const asr = {by: 3, ds: 14, de: 2, vi: 1, sr: 2}

console.log(
Object.fromEntries(
  Object.entries(asr).sort(
    ([ak, av], [bk, bv]) => av > bv ? 1 : -1
  )
)
)

Все остальное я оставлю здесь, даже если это не относится к вашему вопросу.

asr, скорее всего, массив объектов , в этом случае asr.sort() отсортировал массив по результату метода содержащихся объектов toString:

const asr = [{vi: 1}, {sr: 2}, {by: 3}, {ds: 14}, {de: 2}]

console.log(asr.sort())

Если вы хотите отсортировать его по значениям объекта, это поможет:

const asr = [{vi: 1}, {sr: 2}, {by: 3}, {ds: 14}, {de: 2}]

console.log(asr.sort(
  (a, b) => Object.values(a)[0] > Object.values(b)[0] ? 1 : -1
))

Если вы хотите сортировать по ключам объекта, это должно работать:

const asr = [{vi: 1}, {sr: 2}, {by: 3}, {ds: 14}, {de: 2}]

console.log(asr.sort(
  (a, b) => Object.keys(a)[0] > Object.keys(b)[0] ? 1 : -1
))
0 голосов
/ 10 января 2020

Свойства в массивах остаются в том порядке, в котором вы их определяете, если вы хотите, чтобы они были отсортированы, вам нужно определить их отсортированными с самого начала, при этом вы должны получить все свойства вашего массива, отсортировать значения для это свойства из вашего массива и вставить эти отсортированные свойства в новый массив.

const asr = []; 

asr.by = 3; 
asr.de = 2; 
asr.ds = 14;
asr.sr = 2;
asr.vi = 1;

let asr2 = [...asr];

Object.keys(asr)
    .map(key => ({ key, value: asr[key] }))
    .sort((a, b) => b.value - a.value)
    .forEach(a => asr2[a.key] = a.value);

console.log(asr2)

/*
  ds: 14
  by: 3
  de: 2
  sr: 2
  vi: 1
*/

Если вы хотите сохранить свойства в той же позиции, но отсортировать только значения, попробуйте это

const asr = []; 

asr.by = 3; 
asr.de = 2; 
asr.ds = 14;
asr.sr = 2;
asr.vi = 1;

function sortNumber(a, b) {
  return b - a;
}

const asrKeys = Object.keys(asr);
const asrSortedValues =  asrKeys.map(key => asr[key]).sort(sortNumber);

asrKeys.forEach((key, index) => asr[key] = asrSortedValues[index]);

console.log(asr)

/*
    by: 14
    de: 3
    ds: 2
    sr: 2
    vi: 1
*/
0 голосов
/ 10 января 2020

Ваша функция сортировки верна, проверьте с помощью: console.log([51,2,13,4,5].sort(function(a,b) {return b-a}));

asr не массив, а объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...