如何通过id删除子对象并使用过滤器检索父对象



我正在尝试过滤父级,仅通过不匹配来删除其子级 id。 如果不存在子项,则应删除父项。

我尝试这样做,但不起作用。

var rm = 7;
var objects = [
{
name: "parent1",
id: 1,
blog: [
{
name: "child1",
id: 1
},
{
name: "child2",
id: 2
}
]
},
{
name: "parent2",
id: 2,
blog: [
{
name: "child3",
id: 3
},
{
name: "child4",
id: 4
}
]
},
{
name: "parent3",
id: 3,
blog: [
{
name: "child5",
id: 5
},
{
name: "child6",
id: 6
}
]
},
{
name: "parent4",
id: 3,
blog: [
{
name: "child6",
id: 7
}
]
},
]

var result = objects.filter(value => {
if(!value.blog) return;
return value.blog.some(blog => blog.id !== rm)
})
console.log(result);

这里有什么问题,或者有人告诉我正确的方法?

寻找 :

  1. 如果 ID 与 RM、父级和其他子项需要存在,则需要删除博客。

  2. 需要删除父级,删除子项后,如果没有子项(博客)存在。

现场演示

循环浏览父级列表,在该循环中,首先尝试删除具有给定 id 的博客。完成此操作后,您可以检查 blogs 属性是否已变为空,如果是,请将其过滤掉:

// We're going to filter out objects with no blogs
var result = objects.filter(value => {
// First filter blogs that match the given id
value.blog = value.blog.filter(blog => blog.id !== rm);
// Then, if the new length is different than 0, keep the parent
return value.blog.length;
})

我认为下面的代码就是你要找的

var result = objects.map(value => {
const blog = value.blog.filter(blog => blog.id !== rm);
if(blog.length === 0) {
return;
}
value.blog = blog;
return value;
}).filter(item => item);

演示:https://jsfiddle.net/7Lp82z4k/3/

var result = objects.map(parent => {
parent.blog = parent.blog.filter(child => child.id !== rm);
return parent}).filter(parent => parent.blog && parent.blog.length > 0);

最新更新