我有这个数组
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.movies数组的delete数组中删除每个项目?
我正在考虑遍历delete,然后对该数组中的每个项目进行遍历
movies: this.state.config.categories.filter(item => item.id !== deleted.id)
但是我不知道这是否是最好的解决方案,有人可以帮忙吗?
预先感谢
答案 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函数通过几种方式完成。
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)
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)