Почему сортировка и реверсирование массива в Javascript дают желаемый результат

#javascript #arrays #sorting

Вопрос:

 var sortedSquares = function(nums) {
    const squaredArray = []
    for(let i=0; i<nums.length; i  ){
      squaredArray.push(Math.pow(nums[i], 2))
    }
    let arrayWithoutZeros = squaredArray.filter(ele => ele!=0 amp;amp; ele !=1)
    let arrayWithZeros = squaredArray.filter(ele => ele === 0 )
    let arrayWithOnes = squaredArray.filter(ele => ele === 1)
    let finalArray = arrayWithoutZeros.sort().reverse()
    finalArray.unshift(...arrayWithOnes)
    finalArray.unshift(...arrayWithZeros)
    return finalArray
};

const nums = [-4,1,0,3,10]
sortedSquares(nums)
 

Выход: [ 0, 1, 9, 16, 100 ]

Поэтому, когда я вызываю приведенную выше функцию , я подумал, что хорошо, что 0 и 1 заканчиваются в конце массива, ну, я написал массив без него

Но когда я писал этот вопрос, я понял

 var sortedSquares = function(nums) {
    const squaredArray = []
    for(let i=0; i<nums.length; i  ){
      squaredArray.push(Math.pow(nums[i], 2))
    }
    let arrayWithoutZeros = squaredArray.filter(ele => ele!=0 amp;amp; ele !=1)
    let arrayWithZeros = squaredArray.filter(ele => ele === 0 )
    let arrayWithOnes = squaredArray.filter(ele => ele === 1)
    let finalArray = arrayWithoutZeros.sort()
    finalArray.unshift(...arrayWithOnes)
    finalArray.unshift(...arrayWithZeros)
    return finalArray
};

const nums = [-4,1,0,3,10]
sortedSquares(nums)
 

Выход : [ 0, 1, 100, 16, 9 ]

Даже сортировка не возвращает желаемый результат

В чем причина этого, заключается в том, что массивы являются объектами в Javascript

Комментарии:

1. Вам следует лучше прочитать, что unshift делает. Он добавляется в начало массива.

2. Есть ли какая — то причина sortedSquares() , по которой он выполняет все действия? Почему вы извлекаете 0 s и 1 s после возведения в квадрат всех элементов, затем сортируете другие элементы, а затем снова добавляете 0 s и 1 s? Просто поместите все элементы в квадрат и отсортируйте их. — [-4,1,0,3,10].map(x => Math.pow(x, 2)).sort((a, b) => Math.sign(b - a))

Ответ №1:

Причина этого в том, что числа сортируются как строки, а НЕ в соответствии с фактическим значением числа. Поэтому 100 помещается перед 16 в отсортированном массиве. ( 0 s в 100 имеют приоритет по сравнению с 6 in 16 )

Метод sort() сортирует элементы массива на месте и возвращает отсортированный массив. Порядок сортировки по умолчанию-по возрастанию, основанный на преобразовании элементов в строки, а затем сравнении их последовательностей значений кодовых единиц UTF-16.

Array.prototype.sort()

Упрощенная демонстрация:

 const arr = [1, 2, 3, 9, 16, 100, ];

console.log(arr.sort()); //[1, 100, 16, 2, 3, 9]
 
 const arr = [1, 2, 3, 9, 16, 100];

console.log(arr.sort()); 

Вот как вы можете сортировать по числовым значениям:

 const arr = [1, 2, 3, 9, 16, 100, ];

console.log(arr.sort((a, b) => a -b)); //[1, 2, 3, 9, 16, 100]
 
 const arr = [1, 2, 3, 9, 16, 100];

console.log(arr.sort((a, b) => a - b));