javascript - 从数组中删除对象或嵌套对象

标签 javascript arrays ecmascript-6

我需要从给定的对象 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/

相关文章:

javascript - 捕获未捕获( promise )的DOMException javascript

javascript - 如何从另一个数组中的对象属性创建数组

c - 打印数组的元素,直到 C 编程中指定的键

javascript - React 无状态组件中 'const' 变量的顺序

javascript - Node JS - 构建 OAuth2 请求

javascript - nth-of-type 在 IE 8 的媒体查询中不起作用

javascript - Asp.Net MVC 中的 Accordion 使用 html、css 和 JS

javascript - 检查二维数组中的对 Angular 线

javascript - 在 ES6 中我们可以使用 { } 来引用 HTML 中的 JS 变量吗

javascript - ES6 文件上的谷歌地图回调