Получить вложенное значение в массиве на основе условия для другого значения в этом массиве - PullRequest
0 голосов
/ 06 ноября 2018

Мне было трудно создать заголовок для этого вопроса ...

Скажем, у меня есть такие данные:

{"total_results":78,"resources":[{"metadata":{"verified_at":"2018-10-17T21:07:43.935Z","linkages":[{"origin":"ABC","id":"a"},{"origin":"XYZ","id":"b"}]}},{"metadata":{"verified_at":"2018-10-17T21:07:43.935Z","linkages":[{"origin":"ABC","id":"c"},{"origin":"XYZ","id":"d"}]}}]}

Рассмотрим поле resources. Я хочу вывести массив, который включает id для каждого элемента массива. Чтобы получить идентификатор, перейдите в поле связей, которое является массивом, и найдите элемент с "origin": "ABC". Поле id в этом элементе является идентификатором, который должен быть возвращен.

Этот фрагмент кода работает, но кажется слишком многословным. Должен быть более простой способ.

_.map(_.filter(_.flatten(_.map(body.resources, 'metadata.linkages')),['origin','ABC']), 'id')

1 Ответ

0 голосов
/ 06 ноября 2018

Вы можете сделать что-то вроде этого:

var data = { "total_results": 78, "resources": [ { "metadata": { "verified_at": "2018-10-17T21:07:43.935Z", "linkages": [{ "origin": "ABC", "id": "a" }, { "origin": "XYZ", "id": "b" }] } }, { "metadata": { "verified_at": "2018-10-17T21:07:43.935Z", "linkages": [{ "origin": "ABC", "id": "c" }, { "origin": "XYZ", "id": "d" }] } } ] }

 const result = _(data.resources)
  .flatMap('metadata.linkages')
  .filter(['origin', 'ABC'])
  .map('id')
  .value()
	
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

С цепочкой и flatMap + фильтр & map

Другой подход был бы с flatMap & reduce:

var data = { "total_results": 78, "resources": [ { "metadata": { "verified_at": "2018-10-17T21:07:43.935Z", "linkages": [{ "origin": "ABC", "id": "a" }, { "origin": "XYZ", "id": "b" }] } }, { "metadata": { "verified_at": "2018-10-17T21:07:43.935Z", "linkages": [{ "origin": "ABC", "id": "c" }, { "origin": "XYZ", "id": "d" }] } } ] }

const result = _(data.resources)
  .flatMap('metadata.linkages')
  .reduce((r,c) => (_.isEqual(c.origin, 'ABC') ? r.push(c.id) : null, r), [])

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

Еще одна более краткая версия:

var data = { "total_results": 78, "resources": [{ "metadata": { "verified_at": "2018-10-17T21:07:43.935Z", "linkages": [{ "origin": "ABC", "id": "a" }, { "origin": "XYZ", "id": "b" }] } }, { "metadata": { "verified_at": "2018-10-17T21:07:43.935Z", "linkages": [{ "origin": "ABC", "id": "c" }, { "origin": "XYZ", "id": "d" }] } }] }

const result = _.reduce(data.resources, (r,c) => 
   (r.push(_.find(c.metadata.linkages, {origin: 'ABC'}).id), r), [])

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

С ES6 вы можете сделать что-то вроде этого:

var data = { "total_results": 78, "resources": [{ "metadata": { "verified_at": "2018-10-17T21:07:43.935Z", "linkages": [{ "origin": "ABC", "id": "a" }, { "origin": "XYZ", "id": "b" }] } }, { "metadata": { "verified_at": "2018-10-17T21:07:43.935Z", "linkages": [{ "origin": "ABC", "id": "c" }, { "origin": "XYZ", "id": "d" }] } }] }

const result = data.resources.reduce((r,c) => 
   (r.push(c.metadata.linkages.find(x => x.origin == 'ABC').id), r), [])

console.log(result)
...