Очень простая проблема с массивами, циклами и логическим сравнением

1

Очень простой вопрос: я пытаюсь сравнить значения в массиве, и я полностью зациклен на том, почему моя логика сравнения терпит неудачу. Каким-то образом, в течение моей циклы, 6 оценивается как> 524. Любые идеи относительно того, что я делаю неправильно? Я полностью в тупике. Вот код, и спасибо!

function highAndLow(numbers){

    var compArr = numbers.split(" ");

    var highNum = compArr[0]
    var lowNum = compArr[0];


      for (i = 1; i < compArr.length; i++) {
        if (compArr[i] > highNum) {
          highNum = compArr[i]
          console.log(highNum)
        }
      }

      for (i = 1; i < compArr.length; i++) {
        if (compArr[i] < lowNum) {
          lowNum = compArr[i]
        }
      }

      return highNum + " " + lowNum
}

highAndLow("4 5 29 54 4 0 -214 542 -64 1 -3 6 -6")

Опять же, я не уверен, как, но результат, который я получаю на консоли, - 6 для highNum (неправильный) и -214 для lowNum (что верно). Мне что-то не хватает?

Теги:
arrays

2 ответа

1

Элементы compArr являются строками, поэтому их сравнивают лексикографически, а не численно. Вы должны сделать массив чисел:

var compArr = numbers.split(" ").map(Number);

function highAndLow(numbers){

    var compArr = numbers.split(" ").map(Number);

    var highNum = compArr[0]
    var lowNum = compArr[0];


      for (i = 1; i < compArr.length; i++) {
        if (compArr[i] > highNum) {
          highNum = compArr[i]
          console.log(highNum)
        }
      }

      for (i = 1; i < compArr.length; i++) {
        if (compArr[i] < lowNum) {
          lowNum = compArr[i]
        }
      }

      return highNum + " " + lowNum
}

console.log(highAndLow("4 5 29 54 4 0 -214 542 -64 1 -3 6 -6"));
0

отредактирован, чтобы включить ответ Бармара. Спасибо, Бармар!

Я понял. Мое сравнение бежало к краю массива и пыталось сравнить с неопределенным. Кроме того, из-за того, как я установил вещи, этот метод не будет работать с строками только с двумя значениями. Вот мой новый код:

function highAndLow(numbers){

    var compArr = numbers.split(" ").map(Number);

    var highNum = compArr[0]
    var lowNum = compArr[0];

    if (compArr.length === 2) {
      if (compArr[1] > highNum) {
          highNum = compArr[1]
      }
      if (compArr[1] < lowNum) {
          lowNum = compArr[1]
      }

    } else {
        for (i = 1; i < compArr.length - 2; i++) {
          if (compArr[i] > highNum) {
            highNum = compArr[i]
          }
        }

        for (i = 1; i < compArr.length - 2; i++) {
          if (compArr[i] < lowNum) {
            lowNum = compArr[i]
          }
        }
      }

      return highNum + " " + lowNum

}

Однако, вероятно, лучший/более чистый способ сделать это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню