Javascript 根据条件和索引从数组中删除元素
我有一个数组结构,如下所示:Javascript 根据条件和索引从数组中删除元素,javascript,arrays,typescript,Javascript,Arrays,Typescript,我有一个数组结构,如下所示: [ {键:4,数据:{…},qText:{…}, {key:4,data:{…},qText:{…},isVisible:false}, {key:5,data:{…},qText:{…},isVisible:false}, {key:4,data:{…},qText:{…},isVisible:false} ] 我想基于两个条件从中删除元素: 假设我得到一个键值输入为4,那么所有值为4的键都应该被删除 第二种情况是,当使用key:4的嵌套数据(在给定的示例中是
[
{键:4,数据:{…},qText:{…},
{key:4,data:{…},qText:{…},isVisible:false},
{key:5,data:{…},qText:{…},isVisible:false},
{key:4,data:{…},qText:{…},isVisible:false}
]
我想基于两个条件从中删除元素:
我的方法包含很多循环,效果不佳。在性能方面,什么是最好的方法? 1) 尝试按如下方式查找密钥
constdeleteKey=this.followUpQues.filter(quest=>
quest.data.choice.some(y=>y.id==item.id)
).map(任务=>
quest.key
)
2) 试图找到索引,如下所示
this.followUpQues.forEach(函数(val,index){
if(val.data.choice.filter(y=>y.id==item.id).长度>=1){
keyNumber=val.key;
valueIndex=指数;
}
})
this.followUpQues.splice(valueIndex+1,this.followUpQues.length-(valueIndex+1))
:
const值=[
{key:4,data:{},qText:{},
{key:4,data:{},qText:{},isVisible:false},
{key:5,data:{},qText:{},isVisible:false},
{key:4,data:{},qText:{},isVisible:false}
]
函数removeKey(数组:any[],键:number,索引:number=0){
设currentIndex=0;
for(对象中的常量currentKey.keys(数组)){
if(值[currentKey].key==key){
如果(当前索引<索引){
currentIndex++;
}否则{
删除数组[currentKey];
}
}
}
}
removeKey(值4、2);
console.log(值);
请注意,这会改变原始数组。如果要返回新数组,还必须应用深度克隆方法。您可以
在所需索引后对列表进行切片
,然后使用谓词(lambda)函数查找该项。找到项目后,找到项目的索引。如果索引
大于-1
,我们将其删除
const数据=[
{键:4,数据:“”,qText:“”},
{键:4,数据:'',qText:'',isVisible:false},
{键:5,数据:'',qText:'',isVisible:false},
{键:4,数据:'Delete me!',qText:'',isVisible:false}
];
常量remove=(列表,谓词,fromIndex=0)=>{
const found=list.slice(fromIndex).find(item=>predicate(item));
const index=list.indexOf(已找到);
如果(索引>-1)列表。拼接(索引,1);//删除
退货清单;
}
log(删除(数据,项=>item.key==4,2))代码>
.as控制台包装{top:0;最大高度:100%!important;}
您可以使用创建一个新数组,而不需要与条件匹配的元素
const数组=[
{key:4,data:{},qText:{},
{key:4,data:{},qText:{},isVisible:false},
{key:5,data:{},qText:{},isVisible:false},
{key:4,data:{},qText:{},isVisible:false}
];
const result=array.filter((obj,index)=>!(obj.key==4&&index>2));
控制台日志(结果)代码>请添加您的方法和想要的结果。“我的方法包含很多循环,但无效”请在问题中包含此方法。@NinaScholz如果您阅读了问题,并提到想要的结果“我的方法包含很多循环…”-为什么是复数?您只需要一个循环o。O@NinaScholz感谢您的帮助小心使用删除数组[currentIndex]
。这确实有效,但会使数组保留空元素。例如,以数组[1,2,3,4]
为例,使用删除数组[2]
不会导致[1,2,4]
,而是会导致[1,2,4]
。我还刚刚意识到整个For块逻辑很奇怪。当value.key
与提供的key
不匹配时,删除元素。只有当值.key
与提供的键匹配,并且当前索引
小于提供的索引时,才能增加当前索引
。我建议再检查一下你的逻辑,这里出了点问题。你说得很对,我一定是把什么地方搞砸了。我更新了答案。