【问题标题】:Why does sort and reverse an array in Javascript give the desired output为什么在Javascript中对数组进行排序和反转会给出所需的输出
【发布时间】:2021-08-09 08:45:58
【问题描述】:
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 && 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 && 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中的对象

【问题讨论】:

  • 您应该更好地阅读unshift 所做的事情。它将添加到数组的开头
  • sortedSquares() 是否有任何理由执行它所做的所有步骤?为什么要提取0s和1s 对所有元素求平方,然后对other元素排序,然后在0s和@前面加上987654331@s 又来了?只需将所有元素平方并排序 o.O - [-4,1,0,3,10].map(x =&gt; Math.pow(x, 2)).sort((a, b) =&gt; Math.sign(b - a))

标签: javascript arrays sorting


【解决方案1】:

原因是数字被排序为字符串,而不是根据实际的数字值。因此,100 在排序后的数组中位于 16 之前。 (与16 中的6 相比,100 中的0s 具有优先级)

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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    相关资源
    最近更新 更多