如何使用JavaScript对象作为筛选条件?
我有一个对象,用于存储项目之间关系的详细信息,如下所示:如何使用JavaScript对象作为筛选条件?,javascript,Javascript,我有一个对象,用于存储项目之间关系的详细信息,如下所示: var allLinks = [ { source: { itemname: "Hello World", index: 0 }, target: { itemname: "Do Stuff", index: 1 } }, { source: { itemname: "Do Stuff", index: 1 }, target: { itemname: "Hello World", index:
var allLinks = [
{
source: { itemname: "Hello World", index: 0 },
target: { itemname: "Do Stuff", index: 1 }
},
{
source: { itemname: "Do Stuff", index: 1 },
target: { itemname: "Hello World", index: 0 }
},
{
source: { itemname: "Do Things", index: 2 },
target: { itemname: "Hello World", index: 0 }
},
{
source: { itemname: "Hello World", index: 0 },
target: { itemname: "Do Things", index: 2 }
}
];
linksToRemove.map((li) => {
allLinks.filter((item) => item.index !== li.index);
})
我想做的是开发一个函数,从对象中删除所有关系,其中涉及正在被删除/删除的项(作为源或目标)。我创建了一个函数,用于收集需要在数组中删除的关系(节点
表示要删除/删除的项):
这将产生如下输出:
var linksToRemove = [
{
source: { itemname: "Hello World", index: 0 },
target: { itemname: "Do Stuff", index: 1 }
},
{
source: { itemname: "Do Stuff", index: 1 },
target: { itemname: "Hello World", index: 0 }
}
];
因此,我尝试使用该输出来过滤allLinks
对象,如下所示:
var allLinks = [
{
source: { itemname: "Hello World", index: 0 },
target: { itemname: "Do Stuff", index: 1 }
},
{
source: { itemname: "Do Stuff", index: 1 },
target: { itemname: "Hello World", index: 0 }
},
{
source: { itemname: "Do Things", index: 2 },
target: { itemname: "Hello World", index: 0 }
},
{
source: { itemname: "Hello World", index: 0 },
target: { itemname: "Do Things", index: 2 }
}
];
linksToRemove.map((li) => {
allLinks.filter((item) => item.index !== li.index);
})
问题在于,此方法似乎删除了关系内容,但维护了使用未定义的内容索引的项。我是否遗漏了过滤器
的工作原理,或者我做错了什么,是否有其他解释
var allLinks=[{
资料来源:{
项目名称:“你好,世界”,
索引:0
},
目标:{
itemname:“做事”,
索引:1
}
},
{
资料来源:{
itemname:“做事”,
索引:1
},
目标:{
项目名称:“你好,世界”,
索引:0
}
},
{
资料来源:{
itemname:“做事”,
索引:2
},
目标:{
项目名称:“你好,世界”,
索引:0
}
},
{
资料来源:{
项目名称:“你好,世界”,
索引:0
},
目标:{
itemname:“做事”,
索引:2
}
}
];
var linksToRemove=[{
资料来源:{
项目名称:“你好,世界”,
索引:0
},
目标:{
itemname:“做事”,
索引:1
}
},
{
资料来源:{
itemname:“做事”,
索引:1
},
目标:{
项目名称:“你好,世界”,
索引:0
}
}
];
const result=allLinks.filter(x=>!linksToRemove.some(y=>
y、 source.index==x.source.index&&y.target.index==x.target.index))
console.log('result',result)
根据@AluanHaddad对原始帖子的评论回答我自己的问题以提高可见性。我需要重新分配allLinks
数组,因为filter
不会对其进行变异(它会创建一个新数组)
您可能会发现,您不需要linksToRemove
,也不需要更改allLinks
。您可能只需要过滤器
注意:如果您想将allLinks
作为函数调用的一部分进行更新,可以在allLinks.filter(…)
前面拍打allLinks=
让allLinks=getData();
函数删除(节点){
返回allLinks.filter(项=>)[
item.source.index,
item.target.index
].包括(节点索引))
}
log(删除({index:1}))
/********************************************************/
函数getData(){
返回[{
资料来源:{
项目名称:“你好,世界”,
索引:0
},
目标:{
itemname:“做事”,
索引:1
}
},
{
资料来源:{
itemname:“做事”,
索引:1
},
目标:{
项目名称:“你好,世界”,
索引:0
}
},
{
资料来源:{
itemname:“做事”,
索引:2
},
目标:{
项目名称:“你好,世界”,
索引:0
}
},
{
资料来源:{
项目名称:“你好,世界”,
索引:0
},
目标:{
itemname:“做事”,
索引:2
}
}
];
}
过滤器不会改变数组,而是创建一个新的数组。你需要重新分配<代码>as=as.过滤器(f)代码>同时,allLinks.filter((item)=>item.index!==li.index)
没有多大意义>项
或li
是一个没有键索引的对象。它只包含源
和目标
对象,而目标又包含索引
键。你能告诉我们你的节点的样子吗?我有一种感觉,这可以很容易地在一次通过完成。@AluanHaddad修复了它…比我想象的简单!我经常这样想。顺便说一句,如果你没有从map回调返回任何东西,你应该使用forEach而不是map。这太棒了,我以前没有想过像这样使用。includes
。对于其他可能看到这一点的人,我正在使用react
和useState
钩子,以便更新allLinks
作为函数调用的一部分,我只是将allLinks.filter(…)
放在我的setState
函数中。