1. JavaScript / Говнокод #25757

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    function sortWithIndeces(toSort: any) {
      for (let i = 0; i < toSort.length; i++) {
        toSort[i] = [toSort[i], i];
      }
      toSort.sort(function(left: any[], right: any[]) {
        return left[0] < right[0] ? -1 : 1;
      });
      toSort.sortIndices = [];
      for (let j = 0; j < toSort.length; j++) {
        toSort.sortIndices.push(toSort[j][1]);
        toSort[j] = toSort[j][0];
      }
    
      return toSort;
    }
    
    sortWithIndeces(arr);
    
    arr.sortIndices.forEach((item: any, index: number) => {
      result[index] = data[item];
    });

    Нашёл в гите у нас на проекте этот божественный код )
    Сортировка выглядит так, ни одного коммента в коде.
    В ходе анализа стало понятно что таким образом автор пытался восстановить порядок сортировки.

    Запостил: igpo, 09 Августа 2019

    Комментарии (24) RSS

    • Не знал, что в «JavaScript» можно указывать типы
      Ответить
      • Тайпскрипт?
        Ответить
      • Можно было в «ES4». Его даже реализовали в какой-то древней версии Mozilla Suite, но потом убрали.
        Ответить
        • Флеш видимо оттуда и получил свою типизацию?
          Ответить
          • Синтаксис одинаковый, вот только AS2 появился в 2003 году (как выглядел AS1, я сходу не нагуглю), а черновик ES4 опубликовали в 2007.
            Ответить
    • И кстати, использовать any - очень плохая практика.
      Ответить
      • Ну здесь же общий алгоритм, который работает для любых типов с оператором "меньше"... Или в тайпскрипте для них есть какой-нибудь Comparable?
        Ответить
        • если просто, то ts - это типизация для js
          ts не добавляет никаких новых функций
          `left[0] < right[0]` работает потому что ts считает что там тип any, то есть эти значения могут быть числами
          сложно рефакторить код, где используются any
          Ответить
          • Т.е. я не могу перегружать < для своих типов? :(
            Ответить
          • И не могу сделать одну функцию, которая сможет сортировать массивы строк и массивы чисел? Придётся либо копипастить sortNumbers и sortStrings либо юзать any?
            Ответить
            • генериики не завезли разве??
              Ответить
              • Я не знаю, поэтому и спрашиваю.
                Ответить
                • https://www.typescriptlang.org/docs/handbook/generics.html

                  нормально все

                  Any не нужен
                  Ответить
                  • Круто. Надо что-нибудь наваять на TS для интереса.
                    Ответить
              • да, есть там дженерики, но нельзя перегрузить функцию
                придётся в одной функции учесть входные значения всех поддерживаемых типов
                Ответить
                • ну правильно, они же только в момент компиляции есть, а функция-то одна и та же, и на диспатч генерик не влияет

                  Тоже самое и в Java.
                  Проблемы нет только в шаблонах С++ (у или точнее наоборот -- там есть проблемы с пониманием того, что вызовется)
                  Ответить
        • и left[0][0][0][0][0][0][0][0][0][0][0][0][0] тоже отработает, но упадёт в runtime
          Ответить
          • [0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0]
            Кто проживает на дне океана?
            Ответить
      • ну собссно any это отказ от типизации
        зачем тада тайпскрипт?
        Ответить
        • у меня к автору кода тоже есть такой вопрос
          Ответить
    • toSortWithIndices =: /:~ ; /:
         toSortWithIndices 34 2 12 54 85 41 3 54 12
      ┌────────────────────────┬─────────────────┐
      │2 3 12 12 34 41 54 54 85│1 6 2 8 0 5 3 7 4│
      └────────────────────────┴─────────────────┘
      Ответить

    Добавить комментарий