映射和过滤嵌套对象

时间:2020-09-29 04:43:54

标签: javascript

我正在尝试查找包含Name的{​​{1}}和Industry的{​​{1}}的过滤器的所有对象。这是我的对象:

Value

这使我得到非空Tech的对象,在这种情况下,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" } ] } ] LabelsId

1

但是,我似乎无法弄清楚如何将另一个3和/或const containsLabels = obj.filter(({Labels}) => Labels.length > 0); 链接到map上以映射并检查filter和其中包含containsLabels

如何从Name中取出带有Value的对象?我的运行代码是here

2 个答案:

答案 0 :(得分:3)

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

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

forked your fiddle使用工作版本。

没有必要过滤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')
);

答案 1 :(得分:1)

您可以直接在第一个find中进行filter

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'))