Lodash.js (надмножество Underscore.js )
Хорошо не добавлять рамки для каждой простой части логики, но полагаться
Lodash выпускает очень чистый код и способствует более функциональному программированию , который приводит к тому, что он работает на хорошо проверенных средах утилиты, ускоряет разработку и уменьшает количество написанных ошибок. в меньшем количестве ошибок. В одном взгляде становится ясно, что за цель, если код.
Проблема OP может быть просто решена как:
const sortedObjs = _.sortBy(objs, 'last_nom');
Подробнее? Например. у нас есть следующий вложенный объект:
const users = [
{ 'user': {'name':'fred', 'age': 48}},
{ 'user': {'name':'barney', 'age': 36 }},
{ 'user': {'name':'wilma'}},
{ 'user': {'name':'betty', 'age': 32}}
];
Теперь мы можем использовать стенографию _. свойство user.age
, чтобы указать путь к свойству, которое должно быть сопоставлено. Мы будем сортировать объекты пользователя по вложенному возрасту. Да, это позволяет сопоставлять вложенные свойства!
const sortedObjs = _.sortBy(users, ['user.age']);
Хотите, чтобы это было отменено? Нет проблем. Используйте _. Reverse .
const sortedObjs = _.reverse(_.sortBy(users, ['user.age']));
Хотите комбинировать оба с помощью Chaining ?
const sortedObjs = _.chain(users).sortBy('user.age').reverse().value();
Конкатенация (значительно) быстрее согласно моей машине. Но стилистически, я готов заплатить цену замены, если производительность не очень важна. Ну, и если мне нужно форматирование, нет никакой потребности даже задать вопрос... нет никакой опции, кроме как использовать интерполяцию/шаблонную обработку.
>>> import timeit
>>> def so_q_sub(n):
... return "%s%s/%d" % (DOMAIN, QUESTIONS, n)
...
>>> so_q_sub(1000)
'http://stackoverflow.com/questions/1000'
>>> def so_q_cat(n):
... return DOMAIN + QUESTIONS + '/' + str(n)
...
>>> so_q_cat(1000)
'http://stackoverflow.com/questions/1000'
>>> t1 = timeit.Timer('so_q_sub(1000)','from __main__ import so_q_sub')
>>> t2 = timeit.Timer('so_q_cat(1000)','from __main__ import so_q_cat')
>>> t1.timeit(number=10000000)
12.166618871951641
>>> t2.timeit(number=10000000)
5.7813972166853773
>>> t1.timeit(number=1)
1.103492206766532e-05
>>> t2.timeit(number=1)
8.5206360154188587e-06
>>> def so_q_tmp(n):
... return "{d}{q}/{n}".format(d=DOMAIN,q=QUESTIONS,n=n)
...
>>> so_q_tmp(1000)
'http://stackoverflow.com/questions/1000'
>>> t3= timeit.Timer('so_q_tmp(1000)','from __main__ import so_q_tmp')
>>> t3.timeit(number=10000000)
14.564135316080637
>>> def so_q_join(n):
... return ''.join([DOMAIN,QUESTIONS,'/',str(n)])
...
>>> so_q_join(1000)
'http://stackoverflow.com/questions/1000'
>>> t4= timeit.Timer('so_q_join(1000)','from __main__ import so_q_join')
>>> t4.timeit(number=10000000)
9.4431309007150048
опасаться связывать строки в цикле! стоимость конкатенации строк пропорциональна длине результата. Цикличное выполнение приводит Вас прямо к земле N-squared. Некоторые языки оптимизируют конкатенацию к последний раз выделенной строке, но это опасно для рассчитывания на компилятор для оптимизации квадратичного алгоритма вниз к линейному. Лучше всего использовать примитив (join
?), который берет весь список строк, делает единственное выделение и связывает их, все в одном идут.
Не забывайте об именованной замене:
def so_question_uri_namedsub(q_num):
return "%(domain)s%(questions)s/%(q_num)d" % locals()
То, что Вы хотите связать/интерполировать и как Вы хотите отформатировать результат, должно управлять Вашим решением.
Строковая интерполяция позволяет Вам легко добавлять форматирование. На самом деле Ваша строковая версия интерполяции не делает того же самого как Вашей версии конкатенации; это на самом деле добавляет дополнительную наклонную черту вправо перед q_num
параметр. Чтобы сделать то же самое, необходимо было бы записать return DOMAIN + QUESTIONS + "/" + str(q_num)
в том примере.
Интерполяция помогает отформатировать численные данные; "%d of %d (%2.2f%%)" % (current, total, total/current)
было бы намного менее читаемо в форме конкатенации.
Конкатенация полезна, когда у Вас нет постоянного числа объектов для строкового представления.
кроме того, знайте, что Python 2.6 представляет новую версию строковой интерполяции, названной строка, обрабатывающая по шаблону :
def so_question_uri_template(q_num):
return "{domain}/{questions}/{num}".format(domain=DOMAIN,
questions=QUESTIONS,
num=q_num)
Строковая шаблонная обработка намечена для возможной замены % - интерполяция, но этого не произойдет долгое время, я думаю.
"Поскольку конкатенация строк видела большие повышения производительности..."
, Если производительность имеет значение, это хорошо для знания.
Однако проблемы производительности, которые я, никогда видел не сводились к строковым операциям. Я обычно входил в проблему с вводом-выводом, сортировкой и O ( <глоток> n 2 глоток>) операции, являющиеся узкими местами.
, Пока строковые операции не являются ограничителями производительности, я буду придерживаться вещей, которые очевидны. Главным образом это - замена, когда это - одна строка или меньше, конкатенация, когда это имеет смысл и шаблонный инструмент (как Мако), когда это является большим.
Помните, стилистические решения практические решения, если Вы когда-нибудь планируете поддержание или отладку Вашего кода :-) Существует известная кавычка от Knuth (возможно заключающий Hoare в кавычки?): "Мы должны забыть о маленькой эффективности, сказать приблизительно 97% времени: преждевременная оптимизация является корнем всего зла".
, пока Вы боитесь (говорить), поворачивают O (n) задача в O (n <глоток> 2 глоток>) задача, я пошел бы с тем, какой бы ни Вы находите самыми легкими понять..
Я использую замену везде, где я могу. Я только использую конкатенацию, если я расту, строка в говорят для цикла.