как работает нижнее подчёркивание в javascript

171
30 ноября 2018, 05:50
function isSorted(arr) {
  const limit = arr.length - 1;
  return arr.every((_, i) => (i < limit ? arr[i] <= arr[i + 1] : true));
}

Функция работает, как я её понимаю и не понимаю:

  1. i<limit говорит нам, дошли мы до конца массива или нет, если дошли, то выводит, что массив отсортирован (true), если же не дошли, то переходит на следующий элемент массива

  2. arr[i] <= arr[i + 1]

  3. arr.every проверяет, прошли ли все элементы массива установленное условие

  4. а что делает (_, i) =>

Прошу ответить на 4-ый пункт как можно более понятнее, я примерно представляю, что тут происходит, но ещё не совсем, было бы хорошо показать, каким куском кода можно заменить код в пункте 4. И если я ошибся в объяснении других пунктов, тоже прошу исправить. Спасибо.

Answer 1

"_" - это просто символ, ничем не отличающийся от других

а что делает (_, i) =>

В данном случае "_" - это текущий элемент массива, передаваемый в callback-функцию, i - его индекс

arr.every((_, i) => (i < limit ? arr[i] <= arr[i + 1] : true));

В данном случае перебирается весь массив и проверяется, что текущий элемент меньше или равен следующему. Т.е. массив отсортирован. Когда кончаются элементы, то возвращается true

Метод every() вызывает переданную функцию callback один раз для каждого элемента, присутствующего в массиве до тех пор, пока не найдет такой, для которого callback вернет ложное значение (значение, становящееся равным false при приведении его к типу Boolean). Если такой элемент найден, метод every() немедленно вернёт false. В противном случае, если callback вернёт true для всех элементов массива, метод every() вернёт true. Функция callback вызывается только для индексов массива, имеющих присвоенные значения; она не вызывается для индексов, которые были удалены или которым значения никогда не присваивались.

https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/every

Answer 2

Подчеркивание в JavaScript не имеет никаких "магических свойств". Просто автор так назвал параметр анонимной функции.

Метод every вызывает для каждого элемента масива переданную ему функцию. Переданная функция может принимать до 3 параметров - ЗначениеТекущегоЭлемента, ПорядковыйНомерЭтогоЭлемента, и ПеребираемыйМасив. В качестве результата эта фунция должна вернуть true или false. Если все вызовы переданной функции вернут true - every вернет true. Если хоть один вызов вернет false - every вернет false.

Если использовать обычный цикл, то аналогичный код будет выглядить так:

function isSorted(arr) {
    for ( int i = 0; i < arr.length - 1 ; i++ ) 
    {
        if ( arr[i] > arr[i+1] )
        {
            return false;
        }
    }
    return true;
}
Answer 3

Можно упростить ф-ю:

const arr = [1, 2, 3] 
const arr2 = [3, 2, 1] 
 
function isSorted (arr) { 
  return arr.slice(1).every((item, i) => arr[i] >= item) 
} 
 
console.log(isSorted(arr), isSorted(arr2))

Если надо циклом:

const arr = [1, 2, 3] 
const arr2 = [3, 2, 1] 
 
function isSorted (arr) { 
  for (let i in arr.slice(1)) 
    if (arr[i - 1] < arr[i]) 
      return false  
  return true 
} 
 
console.log(isSorted(arr), isSorted(arr2))

READ ALSO
Как считать json в select?

Как считать json в select?

Есть json файлы, сначала считываю их php файлом, потом скриптом пытаюсь перенести эти данные в select список, но где-то ошибкаСкрипт писал не сам,...

211
Сортировка datatable в формате min/max

Сортировка datatable в формате min/max

Всем привет, у меня затык с одним делом Мне с бека приходит информация о цене в формате min/max И как бы надо сделать сортировку по этому полю,...

159
Не работает скрипт в модальном окне

Не работает скрипт в модальном окне

Мне нужно сделать анимацию в модальном окне, которое появляется при клике на кнопкуВ приведенном ниже коде, есть пример рабочей анимации

174