Отображение значения массива json с использованием фильтра и группового - PullRequest
0 голосов
/ 10 октября 2018

Мой JSON, как показано ниже.Я пытаюсь сгруппировать свои объекты на основе идентификатора роли для целевого идентификатора, равного 1083.

Мой json:

[  {
    "id" :1,
    "role": {
      "id": "25",
    },
    "target": {
      "id": "1083",
    }
  },
    {
    "id" :2,
    "role": {
      "id": "25",
    },
    "target": {
      "id": "1083",
    }
  },
    {
    "id" :3,
    "role": {
      "id": "25",
    },
    "target": {
      "id": "1084",
    }
  },
  {
    "id" :4,
    "role": {
      "id": "3",
    },
    "target": {
      "id": "1083",
    }
  }
  ]

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

{
  "25" : [
  {
    "id": 1
    "role": {
      "id": "25",
    },
    "target": {
      "id": "1083",
    }
    },
       { "id": 2
    "role": {
      "id": "25",
    },
    "target": {
      "id": "1083",
    }
    }
  ],
  "3": [
    {
    "id" :4,
    "role": {
      "id": "3",
    },
    "target": {
      "id": "1083",
    }
  }]
}

Итакдля моего результата json он сгруппирован по 25 и 3. Третья запись не существует в моем ожидаемом результате, поскольку ее целевой идентификатор равен 1084

. Я попытался отфильтровать, чтобы получить только целевой идентификатор 1083, но когда я попыталсяиспользуйте grouby, я получаю ошибки

data.filter(o => { 
          return o.target.id === "1083"
        }) 

1 Ответ

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

С lodash через filter и groupBy:

var data = [{ "id": 1, "role": { "id": "25", }, "target": { "id": "1083", } }, { "id": 2, "role": { "id": "25", }, "target": { "id": "1083", } }, { "id": 3, "role": { "id": "25", }, "target": { "id": "1084", } }, { "id": 4, "role": { "id": "3", }, "target": { "id": "1083", } } ]

const groupIt = (targetId) => _.chain(data)
   .filter(x => x.target.id ===targetId)
   .groupBy('role.id')
   .value()

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

Вы можете достичь того же самого без lodash через filter, а затем reduce:

var data = [{ "id": 1, "role": { "id": "25", }, "target": { "id": "1083", } }, { "id": 2, "role": { "id": "25", }, "target": { "id": "1083", } }, { "id": 3, "role": { "id": "25", }, "target": { "id": "1084", } }, { "id": 4, "role": { "id": "3", }, "target": { "id": "1083", } } ]

const groupIt = (targetId) => data.filter(x => x.target.id === targetId)
   .reduce((r, c) => (r[c.role.id] = [...r[c.role.id] || [], c], r), {})

console.log(groupIt('1083'))
...