Как отобразить и отфильтровать массив объектов? - PullRequest
0 голосов

извините, ребята, но у меня есть дурацкий вопрос ... мне нужно перебрать объекты из ответа json и получить только те, которые удовлетворяют некоторым условиям .. ответ такой:

  result = [
      {
        "type": "EVENT",
        "id": "001",
        "tags": [
            {
            "id": "98765",
            "name": "home"
            }
        ]
      },
      {
        "type": "EVENT",
        "id": "002",
        "tags": [
            {
            "id": "7654",
            "name": "contact"
            }
        ]
      },
      {
        "type": "EVENT",
        "id": "003",
        "tags": []
      }
    ]

Мне нужноиспользуйте только те, чей тип 'event' и свойства имени в тегах являются home.

Я пробовал сопоставлять и фильтровать, но не получаю желаемого результата

const eventType = result.filter(type => type.type == 'EVENT')
 const nameFilter = 
    eventType.map(item => item.tags)
    .filter(sub => sub.length) // remove empty []
    .map(subarray => subarray.map(element =>  element.name )
    .filter(element => element == 'home')); 

result:

 [
  ['home'], // dosen t work for me, because need all the object
  [],
  []
 ]

Ответы [ 3 ]

3 голосов
/ 11 мая 2019

Вы можете использовать filter для цикла по массиву.Используйте some, чтобы проверить, имеет ли хотя бы один элемент в массиве tags свойство name со значением "home":

result.filter(o => o.type === "EVENT" && o.tags.some(s => s.name === "home"));

Демонстрация:

let result = [{"type":"EVENT","id":"001","tags":[{"id":"98765","name":"home"}]},{"type":"EVENT","id":"002","tags":[{"id":"7654","name":"contact"}]},{"type":"EVENT","id":"003","tags":[]}];

let filtered = result.filter(o => o.type === "EVENT" && o.tags.some(s => s.name === "home"));

console.log( filtered );
1 голос
/ 11 мая 2019

Вам нужно только filter() и использовать find() или some() для проверки существующего имени в тегах.

var filter = result.filter(c=> c.type == "EVENT" && c.tags.find(d=>d.name == 'home'));
var filter = result.filter(c=> c.type == "EVENT" && c.tags.some(d=>d.name == 'home'));

let result=  [
      {
        "type": "EVENT",
        "id": "001",
        "tags": [
            {
            "id": "98765",
            "name": "home"
            }
        ]
      },
      {
        "type": "EVENT",
        "id": "002",
        "tags": [
            {
            "id": "7654",
            "name": "contact"
            }
        ]
      },
      {
        "type": "EVENT",
        "id": "003",
        "tags": []
      }
    ]
    
    var filter = result.filter(c=> c.type == "EVENT" && c.tags.find(d=>d.name == 'home'));
    
    console.log(filter);
0 голосов
/ 11 мая 2019

Если вы просто хотите выбрать элементы из корневого массива, тогда подходящим способом будет использование фильтра. если вы хотите также преобразовать результат (скажем, выберите объект TAG), вы можете использовать flatMap

result.flatMap( e => (e.type == 'EVENT' && e.tags.some(t => t.name==='home')) ? e.tags : [] )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...