Сценарий Google Apps: почему эта сортировка не работает? - PullRequest
0 голосов
/ 08 февраля 2020

новичок в скрипте Google Apps и попытка найти второе по величине значение в диапазоне. Когда я ввожу диапазон, например [45, 101, 100, 40], возвращается значение 101. Ясно, что sort() не работает, поскольку он просто возвращает второе значение в диапазоне. Чего мне не хватает?

function second_max(range) {
  if (range) {
    var arr = [];
    for (var i = 0; i < range.length; i++) {
      arr.push(range[i]);
    }
    arr.sort();
    Logger.log(arr);
    return arr[1];
  }

}

Ответы [ 2 ]

1 голос
/ 08 февраля 2020

изменить arr.sort() на arr.sort(function(a, b){return a-b}).

Не сортируется, потому что считает, что это строка. Например, [1, 5, 2, 100, 500, 250, 60, 55, 100000] будут отсортированы по [1, 100, 100000, 2, 250, 5, 500, 55, 60].

Итак, вам лучше реализовать функцию обратного вызова вычитания внутри sort (), чтобы вы могли получить правильный результат.

проверьте это: https://www.w3schools.com/jsref/jsref_sort.asp

0 голосов
/ 08 февраля 2020

Проблема:

  • range - это двумерный массив - массив массивов (например: [[45], [101], [100], [40]]). arr.sort может сортировать только числа.

Решение (я):

Вы можете попробовать любое из следующего:

  • Вы можете легко использовать встроенные формулы, такие как SORTN, чтобы сделать то же самое:

    =INDEX(SORTN(A1:A20,2),2)
    
  • Передать compareFunction для анализа массива и Сортировать.

  • Flat десять массив и использование Math.max

Фрагмент:

// Will only work for vertical rows as horizontal ranges like A1:C1 looks like [[1,2,3]]; Modify it accordingly.
function second_max(arr) {
  return arr.sort(([a],[b])=>b-a)[1][0];
}

/* Works with any 2D array*/
function second_max2(arr) {
  let flatArr = arr.flat();
  let max1 = Math.max(...flatArr);
  return Math.max(...flatArr.filter(num=>num !== max1))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...