Así que estoy tratando de cambiar el valor de seleccionado de lo que sea. El valor es lo contrario. Es para una casilla de verificación. No sé, tal vez me falte sueño, pero me está costando mucho tratar de resolver esto. Aquí está la estructura de datos. Es JSON con matrices que tienen objetos.
[ [ { "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
//checked value is the information of the checkbox and valuesArr is the entire array function toggleCheck(checkedValue, valuesArr) { return { value: valuesArr.map((module, i, ...values) => { return [ ...values, (values[i] = module.map((x, j, ...transObj) => ({ ...transObj, selected: x.name === checkedValue.name ? !values[i][j].selected : values[i][j].selected, }))), ]; }), }; }^^^ Esa estructura anterior lo hizo así que es
[ [ [ {}, {}, {} ], [...], [...] ] ]Necesito
[ [ {}, {}, {} ], [...], [...] ]No estoy seguro de si eso es lo que realmente necesita, pero puede usar el método plano para poner todo el json en una sola matriz.
Puedes usarlo así:
const data = yourArray.flat()Y puede iterar la const de datos de una manera más fácil.
Consulte este documento para saber más sobre el método plano:
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/flat
Su toggleCheck es bastante difícil de leer, por lo que no puedo decir por qué no funciona de la manera esperada. Una forma más limpia de hacer esto puede ser:
function toggleCheck(checkedValue, data) { return data.map( arr => arr.map( obj => { if (obj.name == checkedValue.name) { obj.selected = !obj.selected } }) ) } Tenga en cuenta que esto generará un objeto completamente nuevo. No es exactamente un problema, excepto si la matriz contendrá miles de objetos (¡quizás ni siquiera eso!). En su código original, parece que intenta usar índices, no sé si la intención es modificar el objeto original, en ese caso, puede usar forEach en lugar de map :
function toggleCheck(checkedValue, data) { data.forEach( arr => arr.forEach( (obj, i) => { if (obj.name == checkedValue.name) { arr[i].selected = !arr[i].selected } }) ) }No necesita indexar la primera matriz, indexar la segunda es suficiente para obtener la referencia del objeto y modificar el valor como se esperaba.
Sin conocer todos los requisitos que tiene para su código, solo me estoy enfocando en cómo eliminar el anidamiento no deseado de las matrices. También puede simplificar su código con esta solución. El siguiente paso sería decidir si desea que se copien los valores / qué tan profundo desea copiar la matriz y si la lógica de alternancia es realmente lo que está buscando.
function toggleCheck(checkedValue, valuesArr) { let midArray = [...valuesArr]; return midArray.map( (module) => { return module.map( (values)=>{ return { ...values, selected: values.name === checkedValue.name ? !values.selected : values.selected } }) } ) }