Hola a todos, necesito obtener consejos sobre cómo realizar una función de este tipo para buscar y agregar propiedades si el alcance de los niños tiene las mismas identificaciones que el alcance de los padres y agrega la clave isDisable .
Los datos que obtuve y necesito transformarlos con una nueva propiedad isDisable
const data = [ { id: "MT1", children: [] }, { id: "MT2", children: [] }, { id: "MT4", children: [] }, { id: "1234", children: [ { id: "MT1", children: [] }, { id: "MT65", children: [] }, ] }, { id: "537465", children: [{ id: "MT1", children: [] }, { id: "MT2", children: [ { id: "MT1", children: [] }, { id: "MT12", children: [] } ] }, ] } ]Esta es una función para buscar y agregar una propiedad a un elemento y resultado.
const someSearchFunction = (data) => {} console.log(someSearchFunction(data)) const data = [ { id: "MT1", children: [], isDisable: false }, { id: "MT2", children: [], isDisable: false }, { id: "MT4", children: [], isDisable: false }, { id: "MT12", children: [], isDisable: false }, { id: "1234", children: [ { id: "MT1", children: [], isDisable: true }, { id: "MT65", children: [], isDisable: false }, ] }, { id: "537465", children: [ { id: "MT1", children: [], isDisable: true }, { id: "42354322", children: [ { id: "MT1", children: [], isDisable: true }, { id: "MT12", children: [] isDisable: false } ] }, ] } ]¡Gracias!
Podemos hacer esto capturando la lista de ID para el nivel actual para pasar a la llamada recursiva para nuestros hijos.
Aquí hay una versión que no muta la entrada: ¡no somos bárbaros! -- pero devuelve un nuevo árbol con la propiedad isDisable configurada apropiadamente.
const disableDupIds = (xs, ids = [], currLevel = xs .map (x => x .id)) => { return xs .map (({id, children, ...rest}) => ({ id, ...rest, isDisable: ids .includes (id), children: disableDupIds (children, currLevel) })) } const data = [{id: "MT1", children: []}, {id: "MT2", children: []}, {id: "MT4", children: []}, {id: "1234", children: [{id: "MT1", children: []}, {id: "MT65", children: []}]}, {id: "537465", children: [{id: "MT1", children: []}, {id: "MT2", children: [{id: "MT1", children: []}, {id: "MT12", children: []}]}]}] console .log (disableDupIds (data)) .as-console-wrapper {max-height: 100% !important; top: 0} Primero capturamos la lista de ID en nuestro nivel actual, luego simplemente mapeamos nuestros elementos, devolviendo nuevas versiones con isDisable establecido en true cuando nuestra ID actual está en la lista del nivel anterior, y recurrente en nuestros hijos, usando nuestra lista negra de actual identificadores de nivel
Su resultado esperado no es una matriz válida, mejor verifíquelo.
Puedes probar esta función:
const someSearchFunction = (data) => { data.forEach(item => { item.isDisable = false item.children.some(child => { if (data.some(parent => { return parent.id === child.id })) { child.isDisable = true } else { child.isDisable = false } } ) })}