繁体   English   中英

通过迭代对象内的数组中包含的对象内的属性过滤对象数组[Javascript]

[英]Filter an array of objects by the property inside an object contained in an array inside the object iterated [Javascript]

要过滤的数组内部对象的结构如下:

videos:[
  {
    name: 'video name'
    url: 'video url'
    tags: [
      {
        tag: 'reels',
        // other tag info
      },
      {
        tag: 'demos',
        // other tag info
      },
    ]
  },
  ...
] 

我需要通过标签数组内对象上的属性标签过滤视频数组,例如,我需要获取一个包含所有视频对象的数组,其中标签数组存在一个带有标签属性“卷轴”的对象

我试过的*

videos.filter(video => video.tags.tag === 'reels');

返回一个空数组,因为我没有访问标签内的对象来读取标签属性,所以我尝试了以下操作

videos.filter(video => {
  video.tags.forEach(tag => {
    if (tag.tag === 'reels') {
      return true:
    };
  });
});

这看起来有点疯狂和不一致,但我认为我可以迭代每个视频中的标签数组,在videos.filter上迭代并返回true,但它不起作用

有几种方法可以完成同样的事情,可以用.some来做到这一点,它“测试数组中是否至少有一个元素通过了由提供的函数实现的测试。

videos.filter(video => video.tags.some(t => t.tag === "reels"));

您在第二次尝试时非常接近正确。 如果您将其从 forEach 更改为查找并返回值,它将起作用。

 const videos = [ { name: 'video name', url: 'video url', tags: [ { tag: 'reels', }, { tag: 'demos', }, ] }, { name: 'video name2', url: 'video url2', tags: [ { tag: 'demos', }, ] }, ]; const filtered = videos.filter(video => { return video.tags.find(tag => { if (tag.tag === 'reels') { return true; }; }); }); console.log(filtered); // shortened to one line const filtered2 = videos.filter(video => video.tags.find(tag => tag.tag === 'reels')); console.log(filtered2);

暂无
暂无

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

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