我需要从给定的对象 ID 中删除数组中的对象或嵌套对象。
需要删除的对象既可以是数组中的根对象,也可以是根对象之一中的嵌套对象(本例中的变体)。
这是数组结构(根对象和变体对象都有唯一的 ID):
[
{ id: 1, title: 'object without variants', variants: [] },
{ id: 2, title: 'object with variants', variants: [{ id: 21, title: 'variant 1' }, { id: 22, title: 'variant 2' }]
]
例如,如果触发删除函数的点击事件传递的对象ID是1,我想删除整个ID为1的根对象,如果点击事件传递的对象是21,我只需要删除想要删除ID为2的根对象下ID为21的变体,而不是整个根对象。
如何做到这一点?
更新 我通过使用以下代码使其工作(passedObjectId 是要删除的对象的 ID):
array = array.filter(object => object.id !== passedObjectId);
for (let object of array) {
object.variants = object.variants.filter(variant => variant.id !== passedObjectId);
}
如果从对象中删除了最后一个变体,我还需要从数组中删除根对象。
下面的代码可以工作,但是我可以在不使用 3 个 filter() 方法的情况下使其变得更漂亮吗?
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;
});
最佳答案
这是一个关于如何单独删除它们的示例,我让你将它们放在一起。如果您有任何疑问或遇到困难,请随时询问。
const original = [{
id: 1,
title: 'object without variants',
variants: [],
},
{
id: 2,
title: 'object with variants',
variants: [{
id: 21,
title: 'variant 1'
}, {
id: 22,
title: 'variant 2'
}],
},
{
id: 3,
title: 'object with one variant',
variants: [{
id: 21,
title: 'variant 1'
}],
}
];
// Remove the root id
const rootIdToDelete = 1;
const modifiedRoot = original.filter(x => x.id !== rootIdToDelete);
// Remove the variant id
const variantToDelete = 21;
const modifiedRootAndVariant = modifiedRoot.filter((x) => {
x.variants = x.variants.filter(x => x.id !== variantToDelete);
// Keep only the roots that have at least 1 variant
return x.variants.length;
});
console.log(modifiedRootAndVariant);
关于javascript - 从数组中删除对象或嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53444521/