3

Recibo en mi función un objeto con la siguiente información

{
  "name": "Grand modèle",
  "description": "Par 10",
  "price": 0,
  "functional_id": "grand_modele_par_10",
  "quantity": 2,
  "amount": 0
}

necesito comprobar el siguiente array de objetos, en el que se encuentra, para eliminarlo

[
  {
    "name": "Matériel crémation",
    "products": [
      {
        "file": "data:image/;base64,",
        "name": "Sacs bordeaux",
        "description": "Pour les crémations Référence",
        "id": 12,
        "path": "",
        "items": [
          {
            "name": "Petit modèle",
            "description": "Par 25",
            "price": 0,
            "functional_id": "petit_modele_par_25",
            "quantity": 2,
            "amount": 0
          },
          {
            "name": "Grand modèle",
            "description": "Par 10",
            "price": 0,
            "functional_id": "grand_modele_par_10",
            "quantity": 2,
            "amount": 0,
            "itemAdded": false
          }
        ]
      }
    ]
  },
  {
    "name": "Documents",
    "products": [
      {
        "file": "data:image/;base64,",
        "name": "Affiches procédure",
        "description": "De prise en charge",
        "id": 18,
        "path": "",
        "items": [
          {
            "price": 0,
            "functional_id": "affiches_procedure",
            "quantity": 1,
            "amount": 0
          }
        ]
      }
    ]
  }
]

Para ello recorro el array de objetos con un "forEach" para localizar el objeto que cumple la condición de ser igual y eliminarlo

public deleteItem(item) {


        this.fullCartInfo.forEach(category => {
            category.products.forEach(product => {
                product.items.forEach(itemAdded => {
                    if (item.functional_id === itemAdded.functional_id) {
                        this.fullCartInfo.splice(itemAdded);
                    }
                });
            });
        });
        this.cartService.removeItem(item);
    }

lo que obtengo es que se vacíe mi array de objetos. entiendo que deberia recoger la posicion que ocupa en el array con un 'for' y lo he intentado , pero dentro del forEach, en el punto que establezco la condicion no lo ejecuta. ¿Cómo puedo hacer que borre sólo aquel que cumple la condición? ¿Cuál es mi error? Gracias a todos por vuestro tiempo.

homerThinking
  • 249
  • 1
  • 7
  • 1
    Lo primero que muestras no es un objeto sino un JSON y son cosas parecidas pero no iguales – BetaM Jun 16 '20 at 15:51
  • pues muchas gracias, llevo poco tiempo programando y pensaba todo este tiempo que eran objetos. Lo miraré. – homerThinking Jun 16 '20 at 15:59
  • 1
    Te recomiendo leas [este recurso](https://es.stackoverflow.com/questions/164943/cu%c3%a1l-es-la-diferencia-entre-json-y-un-objeto-en-javascript/164944#164944) – BetaM Jun 16 '20 at 16:01
  • 1
    Saludos. Asumiendo es de objeto.products.items; seria que copies objeto.products (incluyendo items), entonces vaciar items y mediante un bucle (de tu preferencia) verifiques acorde a tu condición cual agregar u omitir. Te sugiero compares como cadena de texto (https://www.todojs.com/comparacion-objetos-javascript/) los objetos pero en tu caso (por lo que pones) antes aplicar "delete objetoItem.itemAdded" ya que hay uno pero por esa propiedad no coincide completamente. – RobertoLeOr Jun 16 '20 at 16:04

1 Answers1

1

Necesitas recorrer los objetos, buscar el elemento y, si se encuentra, borrarlo. Más información en comentarios dentro del código:

let item = {
  "name": "Grand modèle",
  "description": "Par 10",
  "price": 0,
  "functional_id": "grand_modele_par_10",
  "quantity": 2,
  "amount": 0
};

let obj = [
  {
    "name": "Matériel crémation",
    "products": [
      {
        "file": "data:image/;base64,",
        "name": "Sacs bordeaux",
        "description": "Pour les crémations Référence",
        "id": 12,
        "path": "",
        "items": [
          {
            "name": "Petit modèle",
            "description": "Par 25",
            "price": 0,
            "functional_id": "petit_modele_par_25",
            "quantity": 2,
            "amount": 0
          },
          {
            "name": "Grand modèle",
            "description": "Par 10",
            "price": 0,
            "functional_id": "grand_modele_par_10",
            "quantity": 2,
            "amount": 0,
            "itemAdded": false
          }
        ]
      }
    ]
  },
  {
    "name": "Documents",
    "products": [
      {
        "file": "data:image/;base64,",
        "name": "Affiches procédure",
        "description": "De prise en charge",
        "id": 18,
        "path": "",
        "items": [
          {
            "price": 0,
            "functional_id": "affiches_procedure",
            "quantity": 1,
            "amount": 0
          }
        ]
      }
    ]
  }
];

// Variable para saber si se encontró el elemento
let found = -1;
// Recorrer items por su posición en el arreglo
for(let i in obj[0].products[0].items) {
    // Comparar nombre
    if(obj[0].products[0].items[i].name == item.name) {
        // Se encontró, guardar posición y salir del ciclo
        found = i;
        break;
    }
}
// Si el elemento existe, found será igual o mayor que cero
if(found > -1) {
    // Eliminar elemento del arreglo
    obj[0].products[0].items.splice(found, 1);
}
// Comprobar resultado
console.log(obj);
Triby
  • 23,274
  • 3
  • 13
  • 35
  • Muchas garcias por tu ayuda y tu tiempo lo primero. He intentado implementar tu solucion pero me devuelve un error en la variable found en todo momento 'Type 'string' is not assignable to type 'number'.'veo que en el snipet te funciona pero incluso si igualo directamente const found = i dentro del loop y antes del break, no me entra la funcion por el for in – homerThinking Jun 17 '20 at 08:45
  • 1
    Es raro, pero intenta cambiando el for: `for(let i = 0; i < obj[0].products[0].items.length; i++) {` – Triby Jun 17 '20 at 14:20
  • perfecto , asi no da problema. Muchas gracias por tu ayuda – homerThinking Jun 18 '20 at 10:29