Поиск максимального значения в массиве (array.find) - PullRequest
0 голосов
/ 05 мая 2020

Я изучаю Javascipt и на самом деле участвую в эпизоде ​​с методами массива. Мое воображаемое упражнение основано на нахождении максимального / минимального значения в массиве методом array.find .

Фактически я сделал что-то подобное, но скрипт вернул мне «Не определено». Пожалуйста помоги. :)

const scores = [10, 20, 30, 22, 25, 109, 90];

const maxScore = scores.find(score => {
 let max = 0;
 for (let i=1; i < scores.length; i++){
   if(score[i] > max){
     max = score[i];
   };
 };
  return max;
});
console.log(maxScore);

PS Я знаю про "Math.max.apply", но мне нужно сделать это с помощью array.find и простого l oop.

Ответы [ 5 ]

1 голос
/ 05 мая 2020

Вы можете выполнить замыкание индекса для цикла с конца и временное максимальное значение, которое в начале не определено и получает первое значение из первого элемента.

Затем l oop, а значение при временном индексе меньше, чем score, сохраните это значение в max, повторите.

В конце верните результат, если индекс плюс один равен временному индексу.

Это подход занимает один l oop. find выполняет итерацию от начала массива и внутреннего l oop от конца массива, если оба индекса пересекаются, результат найден.

const
    scores = [100, 20, 30, 22, 25, 109, 90],
    maxScore = scores.find(
        ((j, max) => (score, i, array) => {
            if (max === undefined) {
                max = score;
                j = array.length;
            }
            if (score < max) return;
            while (array[j - 1] < score) max = array[--j];
            return i + 1 === j;
        })
        ()
    );

console.log(maxScore);
0 голосов
/ 05 мая 2020
const scores = [10, 20, 30, 22, 25, 109, 90];

scores.reduce(function(a,b) { return a > b ? a : b });
// 109
0 голосов
/ 05 мая 2020

Попробуйте следующее:

const scores = [10, 20, 30, 22, 25, 109, 90];

let max = 0;
scores.find(score => { if(score > max) max = score });
console.log(max);

Ваш текущий код зацикливает массив оценок, в то время как он уже зацикливает его, JavaScripts .find, по существу, зацикливает массив.

0 голосов
/ 05 мая 2020

Самый простой способ сделать это, без использования каких-либо методов массива, можно записать как:

const maxScore = (scores) => {
  let score = 0;
  for ( let i = 0; i < scores.length; i++ ) {
    if(scores[i] > score) {
      score = scores[i]
    }
  }

  return score;
}

From MDN :

The find() method returns the value of the first element 
in the provided array that satisfies the provided testing function.

Давайте переопределим снова наша простая функция,

const maxScore = scores => {
  let score = Number.NEGATIVE_INFINITY;
  scores.forEach(element => {
    let acc = scores.find(number => number > score);
    if(!isNaN(acc)) {
      score = acc;
    }
  })

  return score;
}
0 голосов
/ 05 мая 2020

find работает с каждым элементом массива. Поэтому возьмите max за пределами метода find & log max. Кроме того, было две опечатки

const scores = [10, 20, 30, 22, 25, 109, 90];
let max = 0;
const maxScore = scores.find((score) => {

  for (let i = 1; i < scores.length; i++) {
    if (scores[i] > max) {
      max = scores[i];
    };
  };
  return max;
});
console.log(max)
...