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}
]
我想基于两个条件从中删除元素:

  • 假设我得到一个键值输入为4,那么所有值为4的键都应该被删除

  • 第二种情况是,当使用key:4的嵌套数据(在给定的示例中是使用索引1的第二个key:4)时,假设我得到一个index:1和key 4,那么只需要删除该特定的key和index


  • 我的方法包含很多循环,效果不佳。在性能方面,什么是最好的方法? 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
    与提供的
    键匹配,并且
    当前索引
    小于提供的
    索引时,才能增加
    当前索引
    。我建议再检查一下你的逻辑,这里出了点问题。你说得很对,我一定是把什么地方搞砸了。我更新了答案。