Сортировать массив объектов по вложенному свойству с помощью lodash - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть массив таких объектов

[{ ‘a’: { id: 4 }}, { ‘b’: { id: 3 }}, { ‘c’: { id: 2 }}, { ‘d’: { id: 5 }}]

Я хочу узнать с lodash сортировку объектов по идентификатору.Я ожидал получить что-то вроде [‘d’, ‘a’, ‘b’, ‘c’].

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

Ответы [ 5 ]

0 голосов
/ 24 февраля 2019

Это lodash / fp версия решения jo_va .

Используйте _.flow(), чтобы создать функцию, которая отображает каждый объект в пару [key, { id }],Сортировка с _.orderBy() в соответствии с id.Выполните итерацию с _.map() и извлеките _.head() (ключ):

const { flow, flatMap, toPairs, orderBy, map, head } = _

const fn = flow(
  flatMap(toPairs), // convert each object to pair of [key, { id }]
  orderBy(['[1].id'], ['desc']), // order descending by the id
  map(head) // extract the original key
)

const data = [{ 'a': { id: 4 }}, { 'b': { id: 3 }}, { 'c': { id: 2 }}, { 'd': { id: 5 }}]

const result = fn(data)

console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
0 голосов
/ 24 февраля 2019

Вы можете просто сделать это с помощью javascript, используя метод sort и отображая возвращаемый массив и возвращая ключи

var data = [{ 'a': { id: 4 }}, { 'b': { id: 3 }}, { 'c': { id: 2 }}, { 'd': { id: 5 }}]

const res = data.sort((a, b)  => Object.values(b)[0].id - Object.values(a)[0].id).map(obj => Object.keys(obj)[0]);

console.log(res);

Или вы можете использовать lodash с методами orderBy и map

    var data = [{ 'a': { id: 4 }}, { 'b': { id: 3 }}, { 'c': { id: 2 }}, { 'd': { id: 5 }}]

    const res = _.orderBy(data, function(a) {
      return Object.values(a)[0].id
    }, ['desc']).map(o => Object.keys(o)[0])
    
    console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 24 февраля 2019

Вот простое решение JavaScript.

Поскольку вы хотите получить отсортированные ключи в результате, это решение не изменяет исходный массив, благодаря первой map до sort:

const data = [{ 'a': { id: 4 }}, { 'b': { id: 3 }}, { 'c': { id: 2 }}, { 'd': { id: 5 }}];

const sorted = data
  .map(x => Object.entries(x)[0])
  .sort((a, b) => b[1].id - a[1].id)
  .map(x => x[0]);
  
console.log(sorted);

Если вас не волнует изменение исходного массива, вы можете напрямую отсортировать, используя Object.values(), а затем вернуть первый ключ с помощью Object.keys():

const data = [{ 'a': { id: 4 }}, { 'b': { id: 3 }}, { 'c': { id: 2 }}, { 'd': { id: 5 }}];

const sorted = data
  .sort((a, b) => Object.values(b)[0].id - Object.values(a)[0].id)
  .map(x => Object.keys(x)[0]);
  
console.log(sorted);
0 голосов
/ 24 февраля 2019

Вы можете сначала отсортировать на основе идентификатора, а затем сопоставить ключ.

let obj = [{ 'a': { id: 4 }}, { 'b': { id: 3 }}, { 'c': { id: 2 }}, { 'd': { id: 5 }}]

let op = obj
        .sort((a,b) => Object.values(b)[0].id - Object.values(a)[0].id)
        .map(e => Object.keys(e)[0])

console.log(op)
0 голосов
/ 24 февраля 2019

const data = [{ a: { id: 4 }}, { b: { id: 3 }}, { c: { id: 2 }}, { d: { id: 5 }}];
data.sort((a, b) => Object.values(b)[0].id - Object.values(a)[0].id);
console.log(data);

Приведенный выше фрагмент кода показывает, как это сделать с помощью Array.sort.Lodash должен работать аналогично.

...