Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

241
Views
Eliminar de la matriz si se eliminó la clave de propiedad principal

Actualmente estoy tratando de eliminar de una matriz de objetos si se elimina el padre.

Mi matriz se ve así:

 const items = [ { id: '1' generatedFrom: undefined }, { id: '2', generatedFrom: '1', }, { id: '3', generatedFrom: '2' }, { id: '4', generatedFrom: '1' } ]

Tengo un método que filtra los objetos según la identificación que estoy pasando al método:

 const removeFromArray = (id: string) => { const filtered = items.filter(item => item.id !== id); }

Esto me da los resultados correctos que esperaba en términos de eliminar el objeto principal. Sin embargo, el problema que tengo es que esto debería tener un efecto en cadena para el resto de los objetos dentro de la matriz.

Si tomas el ejemplo anterior:

  • Si elimino la identificación 2 , entonces debería eliminar items[1]
  • Como items[2] se generan a partir de la identificación 2 , este también debe eliminarse.
  • items[3] deben seguir existiendo ya que el padre todavía está allí.

Esta podría ser una matriz que tiene muchos elementos dentro y no estoy seguro de cómo abordarla.

Ejemplo de problema actual:

 const items = [ { id: 1, generatedFrom: undefined }, { id: 2, generatedFrom: 1 }, { id: 3, generatedFrom: 2 }, { id: 4, generatedFrom: 3 }, { id: 5, generatedFrom: 4 }, { id: 6, generatedFrom: 1 } ] const removeFromArray = (id) => { return items.filter(item => item.id !== id && item.generatedFrom !== id); } console.log(removeFromArray(2)); // Expected Output: const expected = [ { id: 1, generatedFrom: undefined }, { id: 6, generatedFrom: 1 } ]

about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

Dado que teóricamente podría tener un nivel ilimitado de profundidad, no creo que una llamada a Array.prototype.* sea suficiente aquí. El enfoque de un principiante sería la recursividad, pero puede modificarlo en un proceso de cola:

 const items = [ { id: 1, generatedFrom: undefined }, { id: 2, generatedFrom: 1 }, { id: 3, generatedFrom: 2 }, { id: 4, generatedFrom: 3 }, { id: 5, generatedFrom: 4 }, { id: 6, generatedFrom: 1 } ]; const removeFromArray=(id:number)=>{ let queue:number[]=[id]; let rst=[...items]; while(queue.length>0){ let hd=queue.shift(); rst=rst.filter((item)=>{ if(item.id==hd){ return false; } if(item.generatedFrom==hd){ queue.push(item.id); return false; } return true; }); } return rst; }; console.log(removeFromArray(2));

Zona de juegos en línea

Eliminar 2 te dará

 [{ "id": 1, "generatedFrom": undefined }, { "id": 6, "generatedFrom": 1 }]
about 4 years ago · Juan Pablo Isaza Report

0

Podrías probar con una recursividad:

 const items = [ { id: 1, generatedFrom: undefined }, { id: 2, generatedFrom: 1 }, { id: 3, generatedFrom: 2 }, { id: 4, generatedFrom: 3 }, { id: 5, generatedFrom: 4 }, { id: 6, generatedFrom: 1 } ] const removeFromArray = (id, items) => { items = items.filter(x => x.id !== id); // remove element with id == id // recursively find orphan objects let index = items.findIndex(obj => obj.generatedFrom === id); if (index !== -1) { let newId = items[index].id; items = items.filter(x => x.generatedFrom !== id); return removeFromArray(newId, items) } else return items; } console.log(removeFromArray(2, items));

Dos pasos:

  1. eliminar elemento con id === id ;
  2. encuentre recursivamente todos los objetos que se crearon a partir de la id original y recupere la función filtrando la matriz de resultados.
about 4 years ago · Juan Pablo Isaza Report

0

Puede usar una función recursiva, le aconsejo que use un Set para evitar bucles infinitos o eliminaciones repetidas:

 const items = [ { id: 1, generatedFrom: undefined }, { id: 2, generatedFrom: 1 }, { id: 3, generatedFrom: 2 }, { id: 4, generatedFrom: 3 }, { id: 5, generatedFrom: 4 }, { id: 6, generatedFrom: 1 } ] const ids = new Set(); const deleteById = (id, items) => { ids.delete(id); let filtered = items.filter(item => { if (item.id === id || item.generatedFrom === id) { if(item.id) ids.add(item.id); return false; } return true; }); const it = ids.values(); let next = it.next(); while (!next.done) { const value = next.value; filtered = deleteById(value, filtered); next = it.next(); } return filtered; } console.log(deleteById(2, items));

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!