Javascript 从数组中删除对象或嵌套对象
我需要从给定的对象ID中删除数组中的对象或嵌套对象 需要删除的对象可以是数组中的根对象,也可以是其中一个根对象中的嵌套对象(本例中的变量) 以下是数组结构(根对象和变量对象都有唯一的ID): 例如,如果触发删除函数的单击事件传递的对象ID为1,我想删除ID为1的整个根对象,如果单击事件传递的对象为21,我只想删除ID为2的根对象下ID为21的变量,而不是整个根对象 如何做到这一点 更新 我通过使用以下代码使其正常工作(passedObjectId是要删除的对象的ID): 如果从对象中删除最后一个变量,我还需要从数组中删除根对象 下面的代码可以工作,但是我可以在不使用3个filter()方法的情况下使它更漂亮吗 另一次更新 我最终使用了这段代码,如果删除了最后一个变量,它也会删除一个根对象:Javascript 从数组中删除对象或嵌套对象,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,我需要从给定的对象ID中删除数组中的对象或嵌套对象 需要删除的对象可以是数组中的根对象,也可以是其中一个根对象中的嵌套对象(本例中的变量) 以下是数组结构(根对象和变量对象都有唯一的ID): 例如,如果触发删除函数的单击事件传递的对象ID为1,我想删除ID为1的整个根对象,如果单击事件传递的对象为21,我只想删除ID为2的根对象下ID为21的变量,而不是整个根对象 如何做到这一点 更新 我通过使用以下代码使其正常工作(passedObjectId是要删除的对象的ID): 如果从对象中删除最后一个
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);
}
}
}
}
}