Как сгруппировать массив данных на основе нескольких значений? - PullRequest
0 голосов
/ 01 марта 2019

Я хочу сгруппировать данные на основе типа и type_id. Вот массив

var addArray = [
                    {
                        "id": 24,
                        "language_id": 3,
                        "type": "service",
                        "type_id": 2,
                        "key": "service seeker",
                        "value": " need service"
                    },
                    {
                        "id": 23,
                        "language_id": 3,
                        "type": "service",
                        "type_id": 2,
                        "key": "phone",
                        "value": "phone number"
                    },
                    {
                        "id": 24,
                        "language_id": 3,
                        "type": "service",
                        "type_id": 7,
                        "key": "tester",
                        "value": "service tester"
                    }
                    {
                        "id": 19,
                        "language_id": 3,
                        "type": "offer",
                        "type_id": 4,
                        "key": "source",
                        "value": "resource"
                    }
                ]

Я пытался let result = _.groupBy(addArray,'type'), он группирует данные на основе типа, но мне нужно сгруппировать по типу кактакже как type_id

Ожидаемый вывод

1 Ответ

0 голосов
/ 01 марта 2019

Если вам нужна плоская группировка на основе двух или более свойств, используйте обратный вызов _.groupBy(), чтобы объединить свойства в строку:

const addArray = [{"id":24,"language_id":3,"type":"service","type_id":2,"key":"service seeker","value":" need service"},{"id":23,"language_id":3,"type":"service","type_id":2,"key":"phone","value":"phone number"},{"id":24,"language_id":3,"type":"service","type_id":7,"key":"tester","value":"service tester"},{"id":19,"language_id":3,"type":"offer","type_id":4,"key":"source","value":"resource"}]

const result = _.groupBy(addArray, o => `${o.type}-${o.type_id}`)

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

Если вам нужна многоуровневая группировка, начните с группировки по type, затем сопоставьте группы с _.values() и снова сгруппируйте их по type_id:

const { flow, partialRight: pr, groupBy, mapValues } = _

const fn = flow(
  pr(groupBy, 'type'),
  pr(mapValues, g => groupBy(g, 'type_id'))
)

const addArray = [{"id":24,"language_id":3,"type":"service","type_id":2,"key":"service seeker","value":" need service"},{"id":23,"language_id":3,"type":"service","type_id":2,"key":"phone","value":"phone number"},{"id":24,"language_id":3,"type":"service","type_id":7,"key":"tester","value":"service tester"},{"id":19,"language_id":3,"type":"offer","type_id":4,"key":"source","value":"resource"}]

const result = fn(addArray)

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