JavaScript for loop停止在中间运行

时间:2018-08-04 23:44:02

标签: javascript loops sorting for-loop reduce

我试图按降序返回数字数组(前面最大)。

我的功能似乎可以正常工作,但只是在中间退出。

let array = [1, 9, 8, 7, 2, 6, 3, 5];
let sorted = [];

function sortNumbers(array) {
  for (var i = 0; i < array.length; i++) {
    let max = array.reduce(function(a, b) {
      console.log(`a: ${a} b: ${b}`);
      return Math.max(a, b);
    });
    let maxIdx = array.indexOf(max);
    let biggest = array.splice(maxIdx, 1);
    sorted.push(biggest);
  }
  console.log('sorted array is: ', sorted.join(''));
  //returns 9876
}

sortNumbers(array);

4 个答案:

答案 0 :(得分:1)

您遇到的问题是由循环内的splicing引起的。在遍历数组时可以更改它。快速解决方法是向后遍历数组,因此您可以在循环开始时设置正确的长度:

for (var i = array.length; i > 0; i--) {
  // etc
}

let array = [1, 9, 8, 7, 2, 6, 3, 5];

let sorted = [];

function sortNumbers(array) {
  for (var i = array.length; i > 0; i--) {

    let max = array.reduce(function(a, b) {

      console.log(`a: ${a} b: ${b}`);
      return Math.max(a, b);

    });

    let maxIdx = array.indexOf(max);
    let biggest = array.splice(maxIdx, 1);
    sorted.push(biggest);
  }

  console.log('sorted array is: ', sorted.join('')); //returns 9876

}

sortNumbers(array);

答案 1 :(得分:1)

正如其他人提到的那样,在循环遍历数组时通常会有风险。向后循环可以帮助避免出现以下问题:删除元素并抛出索引,跳过元素,导致逻辑错误或抛出异常。

话虽如此,看来您正在尝试选择排序;但是,如果您只是想对数组进行反向排序和合并,则方法可以简化为:

const array = [1, 9, 8, 7, 2, 6, 3, 5];

const sorted = array.sort((a, b) => b - a);

console.log(sorted.join(""));

答案 2 :(得分:0)

您有理由自己这样做吗?

local: {
        email: String,
        password: String,
        admin: Boolean,
        snoozeAmount: Number,
        snoozeInterval: String,
        emailIntervalWeeks: Number,
        emailIntervalDay: Number,
        isVerified: { type: Boolean, default: false },
        verifyToken: String,
        passwordResetToken: String,
        lastConnectionEdit: Date
    }

答案 3 :(得分:0)

使用Underscore.Js对数组和对象进行各种操作。

Undercore是一个JavaScript库,它提供了很多有用的功能编程助手,而无需扩展任何内置对象

转到以下链接:https://underscorejs.org/#

_。sortBy([1,2,3,4,5,6],function(num){return Math.sin(num);});