Как правильно связать вызовы функций lodash - PullRequest
0 голосов
/ 12 октября 2018

Мне нужно отсортировать массив объектов, а затем взять из него первый элемент.Как добиться этого в lodash?

_.sortBy(window.locations, [{ 'is_primary': 'desc' }])

это дает мне правильный отсортированный массив.как мне взять первый элемент из него, используя функцию _.first()?возможно их цепочка?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Сначала отметим, что _. First - это псевдоним _.head , просто чтобы вы знали и не запутались, почему они оба делают одно и то же.

Кроме того, существует разница между _.sortBy и _.orderBy, которая всегда появляется и также должна быть отмечена:

_. SortBy позволитВы можете сортировать по нотации lodash short или с помощью функции, но только в порядке возрастания !

_. orderBy делает то же самое, нопозволяет вам указать несколько полей с их порядком сортировки (asc / desc) .

Рассмотрим следующие примеры:

var users = [
  { 'user': 'fred',   'age': 1, 'drinks': 1 },
  { 'user': 'barney', 'age': 4, 'drinks': 3 },
  { 'user': 'brat',   'age': 4, 'drinks': 6 },
  { 'user': 'josh',   'age': 2, 'drinks': 2 },
  { 'user': 'jim',    'age': 2, 'drinks': 10 },
  { 'user': 'barney', 'age': 3, 'drinks': 5}
];

const sortBy = _.sortBy(users, ['age','drinks'])
const orderBy = _.orderBy(users, ['age', 'drinks'], ['asc', 'desc'])

console.log('sortBy', sortBy)
console.log('orderBy', orderBy)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

Как видно из результатов (когда пользователи имеют одинаковый возраст), когда дело доходит до сортировки нескольких полей, преимущество достигает orderBy из-за егоудобство.

Итак, вернемся к вашему вопросу:

Вы можете использовать любой из них:

// ONLY ASC
_.head(_.sortBy(window.locations, ['is_primary']));
_.first(_.sortBy(window.locations, ['is_primary']));

// ASC & DESC
_.head(_.orderBy(window.locations, ['is_primary'], ['desc']));
_.first(_.orderBy(window.locations, ['is_primary'], ['desc']));

И последнее цепочка в целом для удобства и удобочитаемости в основном,Если у вас есть более 2 операций, становится сложно читать, поэтому правило, как правило, если больше 2, то цепочка, но если равно или меньше, этого нет.

В большинстве примеров, где используется сцепление, оно применяется более чем к 2 операциям.

Также, как указано, только для объединения цепочек вам нужен дополнительный код из lodash, который вам может не понадобиться.

0 голосов
/ 12 октября 2018

Вы можете использовать _.chain и затем развернуть значение:

https://lodash.com/docs/4.17.10#chain

Другим способом будет просто обернуть ваш результат в _.first, поскольку lodash защищен от undefined, пустые массивы, null и т. д. (худшее, что может случиться, это возврат пустого массива):

_.first(_.sortBy(window.locations, [{ 'is_primary': 'desc' }]));

Примечание о _.chain в среде браузера - это может привести к росту вашего пакетазначительно (поскольку он может включать в себя множество lodash функций в вашем комплекте), прочитайте эту статью, если вас это беспокоит:

https://medium.com/making-internets/why-using-chain-is-a-mistake-9bc1f80d51ba

TL; DR Если вы выполняете простую операцию и заботитесь о размере выходного JS-пакета, просто включите _.first:)

...