【问题标题】:Does the sort method in Javascript not work in a for loop?Javascript中的排序方法在for循环中不起作用吗?
【发布时间】:2019-11-12 16:32:46
【问题描述】:

我正在做一个代码挑战,我试图将排序后的数组中的每个数字与另一个数字进行比较,因为它们无法匹配。我无法完成这个挑战,因为即使我的控制台日志在我在 for 循环中使用它之前正确打印了排序后的数组,一旦我在 for 循环中使用它,数组似乎会保留其原始(未排序)顺序。代码如下:

function minMinMax(array) {
    let minAbsent = 0 
    // sort the array from smallest to largest
    let smallestToLargest = array.sort((a, b) => a - b)
    console.log(smallestToLargest)
    const smallest = smallestToLargest[0]
    // sort the array from largest to smallest
    let largestToSmallest = array.sort((a, b) => b - a)
    const largest = largestToSmallest[0]
    // use second smallest number as starting point for loop, then after each number check 
    // to see if that number is in the array, if not then add the value to our array
    for (i = 1, j = smallestToLargest[1]; i < smallestToLargest.length; i++, j++) {
      if (j !== smallestToLargest[i]) {
        minAbsent = j
        }
        console.log(smallestToLargest[i])
        console.log('this is the min absent ' + minAbsent)
      }
    return [smallest, minAbsent, largest]
  }

当第二个 console.log 打印出来时,它会读回给定的数组(使用原始的数字顺序,而不是排序的顺序)。那么是什么给了?

【问题讨论】:

  • 能否创建一个 sn-p 以便我们运行并检查结果?
  • 另外,您知道在stackoverflow 中您必须将正确答案标记为“正确答案”,对吧?您的所有问题实际上都有任何正确答案。
  • sort 方法 mutates 一个数组。所以最后smallestToLargestlargestToSmallest引用同一个数组
  • 帮自己一个忙,定义 i 和 j
  • 这个测试用例/结果是什么?

标签: javascript arrays sorting numbers


【解决方案1】:

问题似乎在于,尽管您有三个单独的指针,“array”、“smallestToLargest”和“largestToSmallest”,但它们都引用了同一个实际的数组对象。 "array.sort(...)" 对调用方法的数组进行排序并返回对同一数组的引用

如果您在创建 largeToSmallest 后尝试将 minimumToLargest 记录到控制台,您会看到 minimumToLargest 将按降序打印 - 因为在调用第二个 array.sort 时它会按降序排序。

let smallestToLargest = array.sort((a, b) => a - b)
console.log(smallestToLargest);
const smallest = smallestToLargest[0]
// sort the array from largest to smallest
let largestToSmallest = array.sort((a, b) => b - a)
console.log(smallestToLargest);

在随机数组上测试,结果如下:

[1, 3, 14, 29, 311, 323]
[323, 311, 29, 14, 3, 1]

要保留“smallestToLargest”数组,您可以使用“slice(0)”克隆它

试试这个:

function minMinMax(array) {
    let minAbsent = 0 
    // sort the array from smallest to largest
    let smallestToLargest = array.sort((a, b) => a - b).slice(0);
    console.log(smallestToLargest);
    const smallest = smallestToLargest[0]
    // sort the array from largest to smallest
    let largestToSmallest = array.sort((a, b) => b - a).slice(0);
    console.log(smallestToLargest);
    const largest = largestToSmallest[0]
    // use second smallest number as starting point for loop, then after each number check 
    // to see if that number is in the array, if not then add the value to our array
    for (i = 1, j = smallestToLargest[1]; i < smallestToLargest.length; i++, j = smallestToLargest[i]) {
      if (j !== smallestToLargest[i]) {
        minAbsent = j
        }
        console.log(smallestToLargest[i])
        console.log('this is the min absent ' + minAbsent)
      }
  console.log(smallestToLargest);
    return [smallest, minAbsent, largest]
  };

【讨论】:

    【解决方案2】:
    let descend = Object.assign([], array);
    

    以上行不会通过引用复制数组。

    function minMinMax(array) {
      let minAbsent = 0;
      let descend = Object.assign([], array);
      // sort the array from smallest to largest
      let smallestToLargest = array.sort((a, b) => a - b)
      console.log(smallestToLargest)
      const smallest = smallestToLargest[0]
      // sort the array from largest to smallest
      let largestToSmallest = descend.sort((a, b) => b - a)
      const largest = largestToSmallest[0]
      // use second smallest number as starting point for loop, then after each number check 
      // to see if that number is in the array, if not then add the value to our array
      for (i = 1, j = smallestToLargest[1]; i < smallestToLargest.length; i++, j++) {
        if (j !== smallestToLargest[i]) {
          minAbsent = j
        }
        console.log(smallestToLargest[i])
        console.log('this is the min absent ' + minAbsent)
      }
      return [smallest, minAbsent, largest]
    }
    

    我认为这会很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      • 1970-01-01
      相关资源
      最近更新 更多