Лодаш сортировать массив объектов по свойству, которое имеет массив объектов - PullRequest
0 голосов
/ 03 июля 2019

У меня есть объект. Я могу сортировать предметы, используя lodash's _.orderBy(). Однако в одном из сценариев мне нужно отсортировать по subject, который является массивом объектов. Элементы в массиве subject уже отсортированы на основе name.

Поскольку subject - это массив объектов, мне нужно рассмотреть первый элемент для сортировки.

[
  {
    "id": "1",
    "name": "peter",
    "subject": [
      {
        "id": "1",
        "name": "maths"
      },
      {
        "id": "2",
        "name": "social"
      }
    ]
  },
  {
    "id": "2",
    "name": "david",
    "subject": [
      {
        "id": "2",
        "name": "physics"
      },
      {
        "id": "3",
        "name": "science"
      }
    ]
  },
  {
    "id": "3",
    "name": "Justin",
    "subject": [
    ]
  }
]

Ответы [ 3 ]

1 голос
/ 03 июля 2019

Вы можете использовать _.get() для извлечения name (или id) 1-го элемента в subjects. Если элемент не существует, _.get() вернет undefined, который можно заменить значением по умолчанию. В этом случае мы не хотим использовать пустую строку в качестве значения по умолчанию, поскольку порядок изменится. Вместо этого я проверяю, является ли значение строкой, если это я использую строчные буквы, если нет, я возвращаю это как есть.

const arr = [{"id":"1","name":"peter","subject":[{"id":"1","name":"maths"},{"id":"2","name":"social"}]},{"id":"2","name":"david","subject":[{"id":"2","name":"physics"},{"id":"3","name":"science"}]},{"id":"3","name":"Justin","subject":[]}]

const result = _.orderBy(arr, o => {
  const name = _.get(o, 'subject[0].name')
  
  return _.isString(name) ? name.toLowerCase() : name
})

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
0 голосов
/ 03 июля 2019

Поскольку у вас есть вопрос, также помеченный ES6, вот решение только для JS через Array.sort :

let arr = [ { "id": "1", "name": "peter", "subject": [ { "id": "1", "name": "maths" }, { "id": "2", "name": "social" } ] }, { "id": "2", "name": "david", "subject": [ { "id": "2", "name": "physics" }, { "id": "3", "name": "science" } ] }, { "id": "3", "name": "Justin", "subject": [] }, ] 

const result = arr.sort((a,b) => 
  a.subject.length && b.subject.length 
   ? a.subject[0].name.localeCompare(b.subject[0].name) 
   : a.subject.length ? -1 : 1)

console.log(result)
0 голосов
/ 03 июля 2019

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

...