【问题标题】:Filter an array of objects by the property inside an object contained in an array inside the object iterated [Javascript]通过对象内部的属性过滤对象数组,该对象包含在迭代对象内部的数组中[Javascript]
【发布时间】:2025-11-28 11:50:02
【问题描述】:

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

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,但它不起作用

【问题讨论】:

    标签: javascript arrays filter


    【解决方案1】:

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

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

    【讨论】:

    • 它没有达到预期的行为,如果一个元素通过测试,它只会返回 true,它不会返回包含所有通过测试的对象的数组
    • 对不起,我一定很困惑。我以为您只需要在 Video Array 中获取标签等于 'reels' 的项目吗?我写了一个 JSBin,它同时使用了你选择的答案和我的答案,但我看不出有什么区别? jsbin.com/qufeyusotu/edit?js,console
    • 哦,你说得对,这是我的错,我在测试你的答案时犯了一个错误,但它也是正确的。除非您对其进行编辑,否则我无法评分。
    • 啊,没有伤害,没有犯规。我为你做了一些小修改
    【解决方案2】:

    您在第二次尝试时非常接近正确。如果您将其从 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);

    【讨论】: