Неожиданный вывод при сортировке массива объектов, встроенные условные выражения javascript - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь получить отсортированные индексы массива объектов на основе значения свойства. У меня есть следующий упрощенный пример:

let myObj = {myArray:[{amt:0.02380952380952380},{amt:1.0238095238095237},{amt:0.02380952380952380},{amt:-0.02380952380952380}]}
let indices = new Array;

for (let i = 0; i < myObj.myArray.length; i++) {
  indices[i] = i
}

let items = myObj.myArray.slice();
indices.sort((a, b) => (items[a].amt > items[b].amt)
                        ? 1
                        : ((items[b].amt > items[a].amt) ? -1 : 0));

console.log(indices) //gives [ 3, 0, 2, 1 ] expected [ 2, 3, 1, 0 ] or [ 1, 3, 2, 0 ]

Полученный массив indices не дает ожидаемого порядка.

Есть ли здесь что-то простое / очевидное, которого я упускаю?

Примечание. Я не уверен между [2, 3, 1, 0] или [1, 3, 2, 0], поскольку разные браузеры могут интерпретировать одинаковые значения по-разному: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

Если compareFunction (a, b) возвращает 0, оставьте a и b неизменными по отношению друг к другу, но отсортированные по всем различным элементам. Примечание: стандарт ECMAscript не гарантирует такого поведения, поэтому не все браузеры (например, версии Mozilla, датируемые как минимум 2003 годом) соблюдают это.

1 Ответ

0 голосов
/ 10 октября 2019

Приведенный выше код работает правильно. Я использовал indexOf, чтобы получить желаемый результат:

let indices2 = new Array;
for (let i= 0; i<myObj.myArray.length;i++){ indices2[i] = indices.indexOf(i) }

Полный пример:

<html>
<head>
<script>
let myObj = {myArray:[{amt:0.02380952380952380},{amt:1.0238095238095237},{amt:0.023809523809523},{amt:-0.02380952380952380}]}
let indices = new Array;
let indices2 = new Array;

for (let i= 0; i<myObj.myArray.length;i++){ indices[i] = i }
let items = myObj.myArray.slice();
indices.sort((a,b)=> (items[a].amt > items[b].amt) ? 1 : ((items[b].amt > items[a].amt) ? -1 : 0));
for (let i= 0; i<myObj.myArray.length;i++){ indices2[i] = indices.indexOf(i) }
console.log(indices,indices2)  // indices gives [ 3, 0, 2, 1 ] indices2 gives [ 2, 3, 1, 0 ] 

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