Здесь много хороших ответов, но я хотел бы отметить, что их можно очень просто расширить, чтобы добиться более сложной сортировки. Единственное, что вам нужно сделать, это использовать оператор OR для цепочки сравнения, например:
objs.sort((a,b)=> fn1(a,b) || fn2(a,b) || fn3(a,b) )
Где fn1
, fn2
, ... являются функциями сортировки, которые возвращают [- 1,0,1]. Это приводит к «сортировке по fn1», «сортировке по fn2», которая в значительной степени равна ORDER BY в SQL.
Это решение основано на поведении оператора ||
, который оценивает значение первое оцениваемое выражение, которое может быть преобразовано в true .
Простейшая форма имеет только одну встроенную функцию:
// ORDER BY last_nom
objs.sort((a,b)=> a.last_nom.localeCompare(b.last_nom) )
Имея два шага с last_nom
, порядок сортировки first_nom
будет выглядеть так:
// ORDER_BY last_nom, first_nom
objs.sort((a,b)=> a.last_nom.localeCompare(b.last_nom) ||
a.first_nom.localeCompare(b.first_nom) )
Общая функция сравнения может быть примерно такой:
// ORDER BY
let cmp = (a,b,n)=>a[n].localeCompare(b[n])
Эта функция может быть расширена для поддержки числовых полей , чувствительность к регистру, произвольные типы данных и т. д.
Вы можете использовать его с привязкой к ним по приоритету сортировки:
// ORDER_BY last_nom, first_nom
objs.sort((a,b)=> cmp(a,b, "last_nom") || cmp(a,b, "first_nom") )
// ORDER_BY last_nom, first_nom DESC
objs.sort((a,b)=> cmp(a,b, "last_nom") || -cmp(a,b, "first_nom") )
// ORDER_BY last_nom DESC, first_nom DESC
objs.sort((a,b)=> -cmp(a,b, "last_nom") || -cmp(a,b, "first_nom") )
. Дело в том, что чистый JavaScript с функциональным подходом может принять вас долгий путь без внешних библиотек или сложного кода. Это также очень эффективно, так как не нужно выполнять синтаксический анализ строк
В этом примере TEST_EPISODES
используется для изменения критериев решения. С TEST_EPISODES = 1
игра считается решенной, как только последняя игра набирает> 0,80, а с TEST_EPISODES = 20
средний счет за последние 20 раундов должен быть> 0,80, чтобы считать игру решенной.
Поскольку в этой игре есть стохастические действия, т. Е. Вы не получаете один и тот же результат за то, что каждый раз выполняете одно и то же действие в одном и том же состоянии, чем выше вы поднимаетесь TEST_EPISODES
, тем более надежным будет решение , С помощью TEST_EPISODES = 1
этот сценарий будет считать игру решенной, если он просто случайно найдет цель с первой попытки, но вероятность сделать это 20 раз подряд с плохой моделью гораздо меньше.
Среднее значение для большего числа эпизодов часто является лучшим показателем для такого рода проблем, чем скорость достижения цели в первый раз. Представьте, что если вам приходилось работать в этой среде, и ваша жизнь зависела от безопасного достижения цели, вы, вероятно, хотели бы, чтобы она училась до тех пор, пока пороговое значение не станет намного ближе к 1.