繁体   English   中英

映射和过滤嵌套对象

[英]Mapping and filtering a nested object

我正在尝试查找包含具有Industry NameTech Value的过滤器的所有对象。 这是我的对象:

const obj = [{
    "Id": 1,
    "Name": "Video Games",
    "Labels": [{
        "Name": "Industry",
        "Value": "TMT"
      },
      {
        "Name": "Analyst",
        "Value": "Jen Cardage"
      }
    ]
  },
  {
    "Id": 2,
    "Name": "Software",
    "Labels": [],    
  },
  {
    "Id": 3,
    "Name": "Internet",
    "Labels": [{
        "Name": "Industry",
        "Value": "Tech"
      },
      {
        "Name": "Analyst",
        "Value": "Mike Smith"
      }
    ]
  }
]

这让我得到带有非空Labels对象,在这种情况下, Id s 13

const containsLabels = obj.filter(({Labels}) => Labels.length > 0);

但是,我似乎无法弄清楚如何将另一个map和/或filtercontainsLabels以映射并检查其中包含的NameValue

如何从containsLabels获取Id: 3的对象? 我的运行代码在这里

标签是一个数组(与 obj 一样),因此运行find()嵌套应该可以解决问题:

const containsLabels = obj.filter(({ Labels }) => 
  Labels.find(({ Name, Value }) => Name === 'Industry' && Value === 'Tech')
);

把你的小提琴与工作版本分叉了。

没有必要过滤Label.length > 0对象,因为find()在空数组上运行时将return null

如果Labels不总是存在,上面的代码会抛出一个错误。 相反,您可以使用可选的链接运算符( ?. ) 或传统的&&

const containsLabels = obj.filter(({ Labels }) => 
  Labels?.find(({ Name, Value }) => Name === 'Industry' && Value === 'Tech')
);

// Or...
const containsLabels = obj.filter(({ Labels }) => 
  Labels && Labels.find(({ Name, Value }) => Name === 'Industry' && Value === 'Tech')
);

你可以直接在第一个filter find

const containsLabels = obj.filter(({ Labels }) =>
  Labels.find(Label => Label.Value === 'Tech')
)

console.log(containsLabels)

可运行示例

 const obj = [ { Id: 1, Name: 'Video Games', Labels: [ { Name: 'Industry', Value: 'TMT' }, { Name: 'Analyst', Value: 'Jen Cardage' } ] }, { Id: 2, Name: 'Software', Labels: [] }, { Id: 3, Name: 'Internet', Labels: [ { Name: 'Industry', Value: 'Tech' }, { Name: 'Analyst', Value: 'Mike Smith' } ] } ] const containsLabels = obj.filter(({ Labels }) => Labels.find(Label => Label.Value === 'Tech') ) console.log(containsLabels)

或者只是继续链接,如果你愿意,因为filter返回相同元素但过滤的新数组

const containsLabels = obj
  .filter(({ Labels }) => Labels.length > 0)
  .filter(({ Labels }) => Labels.find(Label => Label.Value === 'Tech'))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM