Tengo una matriz de objetos, hay 2 matrices de objetos con la misma identificación, pero una propiedad de objeto es verdadera y otra propiedad es falsa, cómo eliminar ambas si la propiedad es falsa.
[{id: 'a660f87e-476d-493b-a220-31aff8cf764c', selected: true} {id: '1e8284a5-6ba3-48c0-b8ac-f6ffae55b44e', selected: true} {id: 'a660f87e-476d-493b-a220-31aff8cf764c', selected: false}]Así que esta es la matriz, pero 2 objetos tienen id "a660f87e-476d-493b-a220-31aff8cf764c" y uno ha seleccionado la propiedad falsa y otra verdadera, así que si hay falso, quiero que el objeto con esa id se elimine, así que necesito el resultado final como esto.
[{id: '1e8284a5-6ba3-48c0-b8ac-f6ffae55b44e', selected: true}]Si la matriz es así
[{id: 'a660f87e-476d-493b-a220-31aff8cf764c', selected: true} {id: '1e8284a5-6ba3-48c0-b8ac-f6ffae55b44e', selected: true} {id: 'a660f87e-476d-493b-a220-31aff8cf764c', selected: true}]quiero resultado como
[{id: 'a660f87e-476d-493b-a220-31aff8cf764c', selected: true} {id: '1e8284a5-6ba3-48c0-b8ac-f6ffae55b44e', selected: true} ]`¿Alguien puede sugerir una solución?
Gracias
Todo lo que necesitas es Array.reduce con Array.filter
Si desea seleccionar solo aquellos objetos cuya propiedad selected sea verdadera, independientemente del valor que contenga la identificación, puede probar el siguiente fragmento.
let arr = [ {id: 'a660f87e-476d-493b-a220-31aff8cf764c', selected: true}, {id: '1e8284a5-6ba3-48c0-b8ac-f6ffae55b44e', selected: true}, {id: '1e8284a5-6ba3-48c0-b8ac-f6ffae55b44f', selected: false}, {id: '1e8284a5-6ba3-48c0-b8ac-f6ffae55b44e', selected: false}, {id: 'a660f87e-476d-493b-a220-31aff8cf764c', selected: true} ] arr = Object.values(arr.reduce( (a, b) => { a[b.id] = a[b.id] ? a[b.id] : b ; return a; }, {})).filter(a => a.selected === true) console.log(arr); Puede proporcionar su verificación como if una condición para filter
Así que dos elementos de acción en sus preguntas.
selected es verdaderaid seleccionada ya está disponible en una nueva matriz, entonces no es necesario incluirla nuevamente (como si quisiera una matriz única).Puedes lograrlo como a continuación.
let tmp = [{id: '1', selected: true}, {id: '2', selected: true}, {id: '1', selected: true}]; var newArr = []; var tmp1 = tmp.map((itm) => { var t = newArr.map(a => a.id); if(t.indexOf(itm.id) == -1 && itm.selected) { newArr.push(itm); } }); console.log(newArr);Entonces, básicamente, desea eliminar el objeto con selected: false de la matriz, ¿verdad?
Tal vez pueda usar un bucle para eliminar el objeto con selected: false .
let _array = [{ id: 'a660f87e-476d-493b-a220-31aff8cf764c', selected: true }, { id: '1e8284a5-6ba3-48c0-b8ac-f6ffae55b44e', selected: true }, { id: 'a660f87e-476d-493b-a220-31aff8cf764c', selected: false } ]; let temp_array = []; _array.forEach((object, index) => { if (object.selected == false && hasDuplicate(object.id) == true) { _array.splice(index, 1); } }); function hasDuplicate(id) { // function for finding if the element has a duplicate. _array.forEach(object => { temp_array.push(object.id) }); // A temporary array for storing all the ids. var indexes = [], i = -1; while ((i = temp_array.indexOf(id, i + 1)) != -1) { indexes.push(i); } // Finds indexes of all object with same id if (indexes.length > 1) { return true; } // if has more than 1 index it returns true (hasDuplicate = true) return false; }En su pregunta no hay una coma (,) entre los elementos, así que edite su pregunta.