Lodash: поиск и удаление элемента в многоуровневом Json в зависимости от условий - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь удалить элемент в «массиве ролей» на основе условия, но этот массив является элементом в массиве json.Также я должен проверить еще одно условие на родительском уровне, прежде чем заглядывать в список ролей.Я устал от того, что lodash сначала нашел соответствие первому условию на родительском уровне, но не смог перейти к следующему уровню фильтрации.

Мой json:

[ {"unitId": "2", name: "elizabeth", roles: [{ "role":{"roleId" : "2", roleName: "testing"}},  { "role":{"roleId" : "5", roleName: "dev"}}]},
{"unitId": "2", name: "peter", roles: [{ "role":{"roleId" : "1", roleName: "testing"}},  { "role":{"roleId" : "2", roleName: "dev"}}]}
]

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

[ {"unitId": "2", name: "elizabeth", roles: [{ "role":{"roleId" : "2", roleName: "testing"}}}]},
{"unitId": "2", name: "peter", roles: [{ "role":{"roleId" : "1", roleName: "testing"}},  { "role":{"roleId" : "2", roleName: "dev"}}]}
]

Здесь мне нужно сначала проверить unitId: 2, а затем удалить все роли с roleId: 5в этом unitId: 2

1 Ответ

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

Вы можете использовать map & remove с lodash:

const data = [{ unitId: "2", name: "elizabeth", roles: [{ "role": { "roleId": "2", roleName: "testing" } }, { "role": { "roleId": "5", roleName: "dev" } }] }, { unitId: "2", name: "peter", roles: [{ "role": { "roleId": "1", roleName: "testing" } }, { "role": { "roleId": "2", roleName: "dev" } }] } ]

const result = _.map(data, x => (_.isEqual(x.unitId, "2") ? 
   _.remove(x.roles, y => y.role.roleId == "5") : null, x))

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

Вы также можете пропустить lodash и сделать:

const data = [{ unitId: "2", name: "elizabeth", roles: [{ "role": { "roleId": "2", roleName: "testing" } }, { "role": { "roleId": "5", roleName: "dev" } }] }, { unitId: "2", name: "peter", roles: [{ "role": { "roleId": "1", roleName: "testing" } }, { "role": { "roleId": "2", roleName: "dev" } }] } ]

const result = data.map(x => (x.roles = x.unitId == "2" ? 
  x.roles.filter(y => y.role.roleId != '5') : x.roles, x))

console.log(result)

С использованием map и filter

...