根据对象属性过滤另一个数组中的JavaScript数组

时间:2019-10-16 21:08:49

标签: javascript arrays

我在JavaScript中有2个数组。其中一个需要根据另一个属性进行过滤。

我有一个这样的电影列表:

[
  {
    id: 1,
    type: 'movies',
    attributes: {
      name: 'Batman'
    }
  },
  {
    id: 2,
    type: 'movies',
    attributes: {
      name: 'Spiderman'
    }
  },
  ...
]

然后我有另一个数组,其中包含用户观看过的电影,但它们按照JSON API规范的关系位于数组的嵌套对象中。

[
  {
    id: '1',
    type: 'moviesWatched',
    attributes: {
      comment: 'Excellent film, would recommend to anyone who loves a action film!'
    },
    relationships: {
      movie: {
        data: {
           type: 'movies',
           id: 2
        }
      }
    }
  }
]

我需要实现的是,我需要交叉引用watchList[].relationships.movie.data.id中的ID与第一个数组。显然,此列表的制作时间要长得多,但我希望实现的是拥有完整的电影列表,该使用列表中观看的电影带有基于2格式的这种格式的电影名称,从而省去了我不必要存储的麻烦数据库内部的数据。

数组的结果类似于...

[
  {
    id: 1,
    type: 'movies',
    attributes: {
       name: 'Batman'
    },
    meta: {
      watched: false
    }
  },
  {
    id: 2,
    type: 'movies',
    attributes: {
      name: 'Spiderman'
    },
    meta: {
      watched: true
    }
  }
]

这是我目前正在使用的东西,正在工作,但是我不知道是否有更好的方法来解决这个问题...

movies.map((movie) => {
    const watched = watchedMovies.find((searchable) => {
        return searchable.relationships.movie.data.id === searchable.id;
    });

    movie.meta.watched = watched || false;

    return movie;
});

1 个答案:

答案 0 :(得分:3)

由于您说的列表可能很长,因此可以将“观看的”电影ID提取到Set,然后根据电影的{{1 }}在集合中:

meta.watched