ES6 .фильтр внутри .фильтр - PullRequest
0 голосов
/ 02 июля 2018

Итак, у меня есть данные, подобные следующим:

[
     {
      "id": 0,
      "title": "happy dayys",
      "owner": {"id": "1", "username": "dillonraphael"},
      "tags": [{"value": "Art", "label": "Art"}],
      "items": []
     },
     {
      "id": 1,
      "title": "happy dayys",
      "owner": {"id": "1", "username": "dillonraphael"},
      "tags": [{"value": "Architecture", "label": "Architecture"}],
      "items": []
     },
]

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

Это то, что я придумал, но, похоже, все еще отправляет обратно весь массив:

const tagMoodboards = _moodboards.filter(mb => { return mb.tags.filter(t => t.value == name) })

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Чтобы использовать filter(), вам нужно что-то, что вернет истину или ложь - то есть логическое значение. Это должно быть первое место, с которого вы начинаете. Так, учитывая объект, как

{
 "id": 0,
 "title": "happy dayys",
 "owner": {"id": "1", "username": "dillonraphael"},
 "tags": [{"value": "Art", "label": "Art"}],
 "items": []
},

если вы хотите решить, следует ли это использовать, вы можете попробовать Array.some() в массиве tags. Это вернет логическое значение.

let tags = [{"value": "Art", "label": "Art"}]

console.log(tags.some(tag => tag.value = "Art")) // true

Теперь у вас есть возможность использовать filter() и some() вместе. some() вернет true или false для каждого элемента в массиве, и это будет определять, будет ли он отфильтрован или нет:

let arr =  [{"id": 0,"title": "happy dayys","owner": {"id": "1", "username": "dillonraphael"},"tags": [{"value": "Art", "label": "Art"}],"items": []},{"id": 1,"title": "happy dayys","owner": {"id": "1", "username": "dillonraphael"},"tags": [{"value": "Architecture", "label": "Architecture"}],"items": []},]

console.log(arr.filter(obj => obj.tags.some(o => o.value == 'Art') ))
0 голосов
/ 02 июля 2018

Вам не нужно filter внутри filter - скорее, внутри фильтра проверьте, есть ли у some объектов tags свойство .value, которое вы хотите

const _moodboards = [
     {
      "id": 0,
      "title": "happy dayys",
      "owner": {"id": "1", "username": "dillonraphael"},
      "tags": [{"value": "Art", "label": "Art"}],
      "items": []
     },
     {
      "id": 1,
      "title": "happy dayys",
      "owner": {"id": "1", "username": "dillonraphael"},
      "tags": [{"value": "Architecture", "label": "Architecture"}],
      "items": []
     },
];
const name = 'Architecture';
console.log(_moodboards.filter(({ tags }) => (
  tags.some(({ value }) => value === name)
)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...