#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.
Упрощенная демонстрация:
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));