Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从数组中删除对象或嵌套对象_Javascript_Arrays_Ecmascript 6 - Fatal编程技术网

Javascript 从数组中删除对象或嵌套对象

Javascript 从数组中删除对象或嵌套对象,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,我需要从给定的对象ID中删除数组中的对象或嵌套对象 需要删除的对象可以是数组中的根对象,也可以是其中一个根对象中的嵌套对象(本例中的变量) 以下是数组结构(根对象和变量对象都有唯一的ID): 例如,如果触发删除函数的单击事件传递的对象ID为1,我想删除ID为1的整个根对象,如果单击事件传递的对象为21,我只想删除ID为2的根对象下ID为21的变量,而不是整个根对象 如何做到这一点 更新 我通过使用以下代码使其正常工作(passedObjectId是要删除的对象的ID): 如果从对象中删除最后一个

我需要从给定的对象ID中删除数组中的对象或嵌套对象

需要删除的对象可以是数组中的根对象,也可以是其中一个根对象中的嵌套对象(本例中的变量)

以下是数组结构(根对象和变量对象都有唯一的ID):

例如,如果触发删除函数的单击事件传递的对象ID为1,我想删除ID为1的整个根对象,如果单击事件传递的对象为21,我只想删除ID为2的根对象下ID为21的变量,而不是整个根对象

如何做到这一点

更新 我通过使用以下代码使其正常工作(passedObjectId是要删除的对象的ID):

如果从对象中删除最后一个变量,我还需要从数组中删除根对象

下面的代码可以工作,但是我可以在不使用3个filter()方法的情况下使它更漂亮吗

另一次更新

我最终使用了这段代码,如果删除了最后一个变量,它也会删除一个根对象:

array = array.filter(object => {
   const hasRemovedVariant = object.variants.some(variant => variant.id === passedObjectId);

   if (hasRemovedVariant) {
      object.variants = object.variants.filter(variant => variant.id !== passedObjectId);

      return object.variants.length;
   }

   return object.id !== passedObjectId;
});

下面是一个关于如何分别删除它们的示例,我让您把它们放在一起。如果你在做这件事的过程中有任何问题或困难,请随时提问

const-original=[{
id:1,
标题:“没有变体的对象”,
变体:[],
},
{
id:2,
标题:“具有变体的对象”,
变体:[{
id:21,
标题:“变体1”
}, {
身份证号码:22,
标题:“变体2”
}],
},
{
id:3,
标题:“具有一个变量的对象”,
变体:[{
id:21,
标题:“变体1”
}],
}
];
//删除根id
const rootIdToDelete=1;
const modifiedRoot=original.filter(x=>x.id!==rootIdToDelete);
//删除变量id
常数variantToDelete=21;
常量modifiedRootAndVariant=modifiedRoot.filter((x)=>{
x、 variants=x.variants.filter(x=>x.id!==variantToDelete);
//仅保留至少有1个变体的根
返回x.variants.length;
});

console.log(修改后的变量)您需要在数组中循环并检查每个对象id是否匹配(如果是删除对象的id),否则在对象中循环变量并检查匹配并删除对象

确保在修改正在循环的数组时反向循环,因此索引会发生更改,并且可能会出现索引超出范围异常

var myArray = getYourArray();
var idToCheck = 1; // get the id

for(int i=myArray.length;i--){
  if(myArray[i].id == idToCheck){
      myArray.splice(i);
  }
  else{
     if(myArray[i].variants.length>0){
       for(int j=myArray[i].variants.length;j--){
          if(myArray[i].variants[j].id == idToCheck){
             myArray[i].variants.splice(j);
          }
       }
     }
   }
}

此代码段将删除具有指定ID的任何子级,无论层次结构有多大

var myArray=[{
id:1,
标题:“没有变体的对象”,
变体:[]
},
{
id:2,
标题:“具有变体的对象”,
变体:[{
id:21,
标题:“变体1”,
变体:[{
id:23,
标题:“变体1”
}, {
id:24,
标题:“变体2”
}]
}, {
身份证号码:22,
标题:“变体2”
}]
}
]
log(deleteByID(myArray,21));
函数deleteByID(数组,id){
对于(var i=0;i}
在循环中需要有一个循环。 例如,您可以使用forEach

var-arr=[
{id:1,标题:'没有变量的对象',变量:[]},
{id:2,标题:'objectwithvariants',variants:[{id:21,标题:'variant1'},{id:22,标题:'variant2'}]}
];
变量idToDelete=21;
arr.forEach(功能(obj,i){
if(obj.id==idToDelete){
阵列拼接(i,1);
}
对象变量forEach(函数(变量,i){
if(variants.id==idToDelete){
目标变异体剪接(i,1);
}
})
})

console.log(arr)
人们已经回答了,但是一些功能性的、递归的和不可变的代码如何:

let数组=[
{id:1,标题:'没有变量的对象',变量:[]},
{id:2,标题:'objectwithvariants',variants:[{id:21,标题:'variant1'},{id:22,标题:'variant2'}]}
];
常量deleteFromArray=(arr,id)=>{
如果(!arr)返回
设res=[];
arr.forEach((obj)=>{
如果(对象id!==id){
res.push({…obj,variants:deleteFromArray(obj.variants,id)})
}
})
返回res;
}

log(JSON.stringify(deleteFromArray(array,1))
您可以使用
某些
方法创建递归函数,以便在第一次匹配时退出循环,并可以使用
拼接
删除元素

const data=[{id:1,title:'没有变量的对象',变量:[]},{id:2,title:'有变量的对象',变量:[{id:21,title:'变量1'},{id:22,title:'变量2'}]
函数删除(数据、oid){
数据部分((e,i)=>{
if(oid==e.id)返回数据拼接(i,1);
如果(e.变型)拆下(e.变型,oid)
})
}
删除(数据,21)

console.log(data)
您能详细解释一下如何通过单击调用此函数吗?你会传递整个数组还是单个对象?这不是一个“带你的作业”网站。你试过什么?这解决了我的一些问题,谢谢!如果删除了根对象的最后一个变体,我还需要删除根对象-您知道如何执行此操作吗?:)@克里斯德·J。我用一种方法编辑了我的文章
array = array.filter(object => object.id !== passedObjectId);

for (let object of array) {
   // Remove the variant from the root object
   object.variants = object.variants.filter(variant => variant.id !== passedObjectId);

   // Remove the root object, if there's no variants left in it
   if (!object.variants.length) {
      array = array.filter(object => object.id !== passedObjectId);
   }
}
array = array.filter(object => {
   const hasRemovedVariant = object.variants.some(variant => variant.id === passedObjectId);

   if (hasRemovedVariant) {
      object.variants = object.variants.filter(variant => variant.id !== passedObjectId);

      return object.variants.length;
   }

   return object.id !== passedObjectId;
});
var myArray = getYourArray();
var idToCheck = 1; // get the id

for(int i=myArray.length;i--){
  if(myArray[i].id == idToCheck){
      myArray.splice(i);
  }
  else{
     if(myArray[i].variants.length>0){
       for(int j=myArray[i].variants.length;j--){
          if(myArray[i].variants[j].id == idToCheck){
             myArray[i].variants.splice(j);
          }
       }
     }
   }
}