Сортировка массивов объектов, когда ключ имеет разные имена - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь понять, как сортировать массив объектов JavaScript по целочисленным значениям. Однако мне не очень повезло, когда я посмотрел несколько предыдущих решений в Интернете. Я подозреваю, что это может быть связано с тем, как я построил свой массив, но из-за недостатка знаний я не уверен в причине.

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

У меня есть массив объектов JavaScript, который выглядит следующим образом:

(10) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
0: {Avobath_Count: "5"}
1: {DragonsEgg_Count: "3"}
2: {Intergalactic_Count: "2"}
3: {Twilight_Count: "9"}
4: {SexBomb_Count: "6"}
5: {TheExperimenter_Count: "6"}
6: {TurtleImmersion_Count: "5"}
7: {Butterball_Count: "3"}
8: {MarshmallowWorld_Count: "0"}
9: {ThinkPink_Count: "2"}

Я пытался использовать:

keysSorted = Object.keys(presentationOrder).sort(function(a,b){return presentationOrder[a]-presentationOrder[b]}).map(key => presentationOrder[key]);

Однако, это не отсортировало мой массив от высокого до низкого на основе значений.

Я бы хотел, чтобы мой массив выглядел следующим образом:

(10) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]

0: {Twilight_Count: "9"}
1: {SexBomb_Count: "6"}
2: {TheExperimenter_Count: "6"}
3: {Avobath_Count: "5"}
4: {TurtleImmersion_Count: "5"}
5: {Butterball_Count: "3"}
6: {DragonsEgg_Count: "3"}
7: {Intergalactic_Count: "2"}
8: {ThinkPink_Count: "2"}
9: {MarshmallowWorld_Count: "0"}

Любое руководство будет очень цениться.

Ответы [ 4 ]

2 голосов
/ 17 апреля 2019

Если все objects внутри массива имеют только одну пару key-value, тогда вы можете использовать Object.values ​​() внутри метода sort():

let input = [
  {Avobath_Count: "5"},
  {DragonsEgg_Count: "3"},
  {Intergalactic_Count: "2"},
  {Twilight_Count: "9"},
  {SexBomb_Count: "6"},
  {TheExperimenter_Count: "6"},
  {TurtleImmersion_Count: "5"},
  {Butterball_Count: "3"},
  {MarshmallowWorld_Count: "0"},
  {ThinkPink_Count: "2"}
];

input.sort((a ,b) => Object.values(b)[0] - Object.values(a)[0]);
console.log(input);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

Или вы также можете использовать Object.entries () тоже:

let input = [
  {Avobath_Count: "5"},
  {DragonsEgg_Count: "3"},
  {Intergalactic_Count: "2"},
  {Twilight_Count: "9"},
  {SexBomb_Count: "6"},
  {TheExperimenter_Count: "6"},
  {TurtleImmersion_Count: "5"},
  {Butterball_Count: "3"},
  {MarshmallowWorld_Count: "0"},
  {ThinkPink_Count: "2"}
];

input.sort((a, b) => Object.entries(b)[0][1] - Object.entries(a)[0][1]);
console.log(input);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
1 голос
/ 17 апреля 2019

Когда вы сделали Object.keys, вы получили имена полей и потеряли доступ к их счетам.Вместо этого получите их счет, используя Object.values()[0] внутри обработчика сортировки.

let input = [
  {Avobath_Count: "5"},
  {DragonsEgg_Count: "3"},
  {Intergalactic_Count: "2"},
  {Twilight_Count: "9"},
  {SexBomb_Count: "6"},
  {TheExperimenter_Count: "6"},
  {TurtleImmersion_Count: "5"},
  {Butterball_Count: "3"},
  {MarshmallowWorld_Count: "0"},
  {ThinkPink_Count: "2"},
];

let output = input.sort((a, b) => Object.values(b)[0] - Object.values(a)[0]);

console.log(output);
1 голос
/ 17 апреля 2019

Вы можете использовать Object.values, чтобы извлечь значения объекта и сравнить его с sort

let arr = [
  {Avobath_Count: "5"},
  {DragonsEgg_Count: "3"},
  {Intergalactic_Count: "2"},
  {Twilight_Count: "9"},
  {SexBomb_Count: "6"},
  {TheExperimenter_Count: "6"},
  {TurtleImmersion_Count: "5"},
  {Butterball_Count: "3"},
  {MarshmallowWorld_Count: "0"},
  {ThinkPink_Count: "2"},
]

arr.sort((a, b) => Object.values(b)[0] - Object.values(a)[0]);

console.log(arr);
0 голосов
/ 17 апреля 2019

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

Если у вас есть контроль над тем, как строится ваш массив, я бы предложил изменить структуру объекта:

let input = [ 
  { "Name": "Avobath", "Count": "5" },
  { "Name": "DragonsEgg", "Count": "3" },
  { "Name": "Intergalactic", "Count": "2" },
  { "Name": "Twilight", "Count": "9" },
  { "Name": "SexBomb", "Count": "6" },
  { "Name": "TheExperimenter", "Count": "6" },
  { "Name": "TurtleImmersion", "Count": "5" },
  { "Name": "Butterball", "Count": "3" },
  { "Name": "MarshmallowWorld", "Count": "0" },
  { "Name": "ThinkPink", "Count": "2" } 
  ];

input.sort((a, b) => +b.Count - +a.Count);
console.log(input);

Это не только упрощает сортировку по количеству, но и делает ваш код чище (и понятнее).

Скажем таквозможно, вы захотите отсортировать массив по алфавиту:

let input = [ 
  { "Name": "Avobath", "Count": "5" },
  { "Name": "DragonsEgg", "Count": "3" },
  { "Name": "Intergalactic", "Count": "2" },
  { "Name": "Twilight", "Count": "9" },
  { "Name": "SexBomb", "Count": "6" },
  { "Name": "TheExperimenter", "Count": "6" },
  { "Name": "TurtleImmersion", "Count": "5" },
  { "Name": "Butterball", "Count": "3" },
  { "Name": "MarshmallowWorld", "Count": "0" },
  { "Name": "ThinkPink", "Count": "2" } 
  ];

input.sort((a, b) => a.Name.localeCompare(b.Name));
console.log(input);

Чтобы это работало в вашей первоначальной структуре, вам нужно сделать следующее:

input.sort((a ,b) => Object.keys(a)[0].localeCompare(Object.keys(b)[0]));

Что не очень красиво выглядит, вмое мнение.

Скажем также, что теперь вы решили добавить еще одно свойство к вашим объектам.Затем вы обнаружите, что ваша сортировка больше не работает:

let input = [
  {AnotherProp: "13", Avobath_Count: "5"},
  {AnotherProp: "-1", DragonsEgg_Count: "3"},
  {AnotherProp: "7", Intergalactic_Count: "2"},
  {AnotherProp: "5", Twilight_Count: "9"},
  {AnotherProp: "11", SexBomb_Count: "6"},
  {AnotherProp: "2", TheExperimenter_Count: "6"},
  {AnotherProp: "0", TurtleImmersion_Count: "5"},
  {AnotherProp: "4", Butterball_Count: "3"},
  {AnotherProp: "6", MarshmallowWorld_Count: "0"},
  {AnotherProp: "1", ThinkPink_Count: "2"}
];

input.sort((a ,b) => Object.values(b)[0] - Object.values(a)[0]);
console.log(input);

Этого никогда не произойдет, если вы сохраните Name и Count как отдельные свойства, как предлагалось ранее.Я мог бы продолжать упоминать другие примеры, в которых ваша текущая структура объекта может усложнить вам задачу (и другим, пытающимся прочитать ваш код), но я думаю, этого уже достаточно.

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