首页 > 解决方案 > 如何映射和过滤对象数组?

问题描述

对不起,伙计们,但我有一个愚蠢的问题..我需要从 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": []
      }
    ]

我只需要使用类型为“事件”且标签中的名称属性为 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')); 

结果:

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

标签: javascriptarraysobjectecmascript-6functional-programming

解决方案


您可以使用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 );


推荐阅读