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

时间:2019-02-01 22:37:33

标签: javascript arrays filter

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

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

我需要通过标签数组内的对象上的属性标签来过滤视频数组,例如,我需要获得一个包含所有视频对象的数组,标签数组上存在一个具有标签属性“ reels”的对象

我尝试了什么*

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

完成同一件事的几种方法,可以通过.some来完成,{测试数组中的至少一个元素是否通过了提供的功能实现的测试。

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