Отображение значения массива json с использованием filter, groupby и orderby - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть json в следующем формате

[{
    "id": 1,
    "role": {
      "id": "25",
    },
    "target": {
      "id": "1083",
    },
    "staff": {
      "name: "
      ccc "
    }
  },
  {
    "id": 2,
    "role": {
      "id": "25",
    },
    "target": {
      "id": "1083",
    },
    "staff": {
      "name: "
      aaa "
    }
  },
  {
    "id": 3,
    "role": {
      "id": "25",
    },
    "target": {
      "id": "1084",
    },
    "staff": {
      "name: "
      staff1 "
    }
  },
  {
    "id": 4,
    "role": {
      "id": "3",
    },
    "target": {
      "id": "1083",
    },
    "staff": {
      "name: "
      aaa "
    }
  }
]

Я пытаюсь сгруппировать по идентификатору роли для всех конкретных идентификаторов цели. Все работает нормально, за исключением того, что я хотел также отсортировать содержимое по имени персонала.

const groupIt = targetId =>
  chain(data[2])
  .filter(x => x.target.id === targetId)
  .groupBy("role.id")
  .value()

console.log(groupIt('1083'))

Ожидаемый результат

{
  "25": [{
      "id": 2 "role": {
        "id": "25",
      },
      "target": {
        "id": "1083",
      },
      "staff": {
        "name": "aaa"
      }

    },
    {
      "id": 2 "role": {
        "id": "25",
      },
      "target": {
        "id": "1083",
      },
      "staff": {
        "name": "ccc"
      }
    }
  ],
  "3": [{
    "id": 4,
    "role": {
      "id": "3",
    },
    "target": {
      "id": "1083",
    },
    "staff": {
      "name": "staff1"
    }
  }]
}

Я пытался также поддерживать порядок, но он не работал.Я думаю о том, чтобы пройтись по каждой роли и отсортировать их.Но я думаю, есть ли другое решение.

1 Ответ

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

Вы можете заказать, а затем сгруппировать элементы.Это установит порядок внутри групп.Однако это не повлияет на порядок групп, поскольку role.id является числовым свойством , которое можно преобразовать в целое число .

const data = [{"id":1,"role":{"id":"25"},"target":{"id":"1083"},"staff":{"name":"ccc"}},{"id":2,"role":{"id":"25"},"target":{"id":"1083"},"staff":{"name":"aaa"}},{"id":3,"role":{"id":"25"},"target":{"id":"1084"},"staff":{"name":"staff1"}},{"id":4,"role":{"id":"3"},"target":{"id":"1083"},"staff":{"name":"aaa"}}]

const groupIt = targetId =>
  _(data)
  .filter(['target.id', targetId])
  .orderBy('staff.name')
  .groupBy('role.id')
  .value()

console.log(groupIt('1083'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
...