Estoy tratando de cambiar el valor de selected de lo que sea actualmente (verdadero o falso) al opuesto cuando un usuario hace clic en una casilla de verificación. Se supone que mi función toggleCheck devuelve todos los datos con el valor de selección alterado. Aquí está la estructura de datos. Es un objeto con arreglos que tienen objetos.
{ "ModuleName": [{ "module": "string", "selected": false, "name": "title", "points": [{ "category": "category1", "description": "desc1", "provided": "provided1" }, { "category": "category1", "description": "desc", "provided": "something" } ] }, { "module": "string", "selected": false, "name": "title_one", "points": [{ "category": "category1", "description": "desc1", "provided": "provided1" }, { "category": "category1", "description": "desc", "provided": "something" } ] } ], [...], [...] }Mi intento más cercano pero es el formato incorrecto
function toggleCheck(checkedValue, valuesArr) { return { value: Object.entries(valuesArr).map(([key, values], i) => values.map((x) => { return { ...x, selected: x.name === checkedValue.name ? !x.selected : x.selected, }; }) ), }; }probablemente porque usé un mapa que lo envolvió en una matriz
[ [ {}, {}, {} ], [...], [...] ]^^^ Lo que tengo
{ "Name": [ {}, {}, {} ], "Name": [...], "Name": [...] }^^^ Lo que necesito
function toggleCheck(checkedValue, valuesArr) { //Step 0: Change the value in the data let checked = Object.entries(valuesArr).map(([key, values], i) => values.map((x) => { return { ...x, selected: x.name === checkedValue.name ? !x.selected : x.selected, }; }) ); //Step 1: Group the modules into like arrays let grouped = checked .flat().reduce(function (r, a, i) { if (!i || r[r.length - 1][0].module !== a.module) { return r.concat([[a]]); } r[r.length - 1].push(a); return r; }, []); //Step 2: Assign the new object properties as the arrays. //The key being the module name. let newObj = {}; grouped.map((x, i) => { newObj[x[0].module] = x; }); return {value: newObj}; }En tu pregunta escribiste:
{ "Name": [ {}, {}, {} ], "Name": [...], "Name": [...] }^^^ Lo que necesito
esto no puede existir en el objeto JS. Solo se tendrá en cuenta la última asignación de la propiedad nombre, todas las anteriores son solo valores antiguos de esta propiedad
codificación:
const data = { name:'aaa' , name:'bbb' , name:'ccc' }es lo mismo que codificar
const data = {} data.name = 'aaa' data.name = 'bbb' data.name = 'ccc'prueba:
const data = { name:'aaa' , name:'bbb' , name:'ccc' } console.log( data ) .as-console-wrapper {max-height: 100% !important;top: 0;} .as-console-row::after {display: none !important;}