从另一个阵列中以反应状态删除一个阵列中的多个项目

时间:2020-08-05 06:24:11

标签: javascript arrays reactjs

我有这个数组

let deleted = [
  {id: '123', name: 'Something'},
  {id: '321', name: 'Something1'}
];

我有这个

this.setState({
            config: {
                ...this.state.config,
                categories: this.state.config.categories.map(cat => ({
                    ...cat,
                    movies: [...cat.movies, ...currentMovies]
                }))
            }
        });

每个类别的每个电影数组都包含deleted数组中的所有项目,但它们不是同一数组,因为有些包含选定的属性,有些不包含所选属性,但是电影ID相同。

如何从每个category.movi​​es数组的delete数组中删除每个项目?

我正在考虑遍历delete,然后对该数组中的每个项目进行遍历

movies: this.state.config.categories.filter(item => item.id !== deleted.id)

但是我不知道这是否是最好的解决方案,有人可以帮忙吗?

预先感谢

2 个答案:

答案 0 :(得分:0)

这应该有效。同时使用地图过滤电影。

const filt = (item) => item.id !== deleted.id;
this.state.config.categories.filter(filt).map(({ movies, ...rest }) => ({
  ...rest,
  movies: movies.filter(filt),
}));

答案 1 :(得分:0)

不清楚状态结构是什么,但是通过检查要删除的电影数组来过滤电影数组可以使用array :: filter函数通过几种方式完成。

  1. 每次迭代搜索删除的数组,并检查电影ID是否匹配( O(n)线性搜索)。如果找不到匹配项,则将其包括在结果中。
movies.filter(movie => !deleted.some(({ id }) => movie.id === id))

let deleted = [
  { id: "123", name: "Something" },
  { id: "321", name: "Something1" }
];

const currentState = {
  movies: [
    { id: "120", name: "Something 120" },
    { id: "121", name: "Something 121" },
    { id: "122", name: "Something 122" },
    { id: "123", name: "Something" },
    { id: "124", name: "Something 124" },
    { id: "125", name: "Something 125" },
    { id: "321", name: "Something1" }
  ]
};

const nextState = currentState.movies.filter(
  movie => !deleted.some(({ id }) => movie.id === id)
);

console.log(nextState)

  1. 创建一个已删除电影ID的地图,这样就不必每次都进行搜索( O(1)恒定时间搜索)。
const deletedMovieIdSet = deleted.reduce((ids, { id }) => {
  ids.add(id);
  return ids;
}, new Set());

...

movies.filter(movie => !deletedMovieIdSet.has(movie.id))

let deleted = [
  { id: "123", name: "Something" },
  { id: "321", name: "Something1" }
];

const deletedMovieIdSet = deleted.reduce((ids, { id }) => {
  ids.add(id);
  return ids;
}, new Set());

const currentState = {
  movies: [
    { id: "120", name: "Something 120" },
    { id: "121", name: "Something 121" },
    { id: "122", name: "Something 122" },
    { id: "123", name: "Something" },
    { id: "124", name: "Something 124" },
    { id: "125", name: "Something 125" },
    { id: "321", name: "Something1" }
  ]
};

const nextState = currentState.movies.filter(
  movie => !deletedMovieIdSet.has(movie.id)
);

console.log(nextState)