const formatData = (data) => { return data.map((item) => { let news = { ...item, isLeaf: item.haveNext ? false : true } if (item.children && item.children.length > 0) { news.children = formatData(item.children); } return news }) } let arr = [{ title: 1, haveNext: false, children: [{ title: 2, haveNext: true, children: [{ title: 3, haveNext: true, }] }] }] quiero arr cambiar a
No sé cómo escribir algo de código. Por favor, ayúdenme arr2 = [{ title: 1, isLeaf: false, children: [{ title: 2, isLeaf: true, children: [{ title: 3, isLeaf: true, }] }] }]
const formatData2 = (data) => { return data.reduce((acc, { haveNext, ...rest }) => { let news:any = { ...rest, isLeaf: haveNext ? false : true } if (rest.children && rest.children.length > 0) { //How to write here } acc = acc.concat(news) return acc }, []) } console.log(formatData2(arr))Puede usar una función recursiva para obtener los resultados que necesita.
let arr = [{ title: 1, haveNext: false, children: [{ title: 2, haveNext: true, children: [{ title: 3, haveNext: true, }] }] }]; function loop(arr) { // `map` over the array return arr.map(obj => { // Destructure the properties from the each array object const { children, haveNext, title } = obj; // If there is a "children" property create a // new object but call the function again with the children // and change the haveNext prop to newLeaf if (children) { return { title, newLeaf: haveNext, children: loop(children) }; } // Otherwise just return the updated object // (haveNext to newLeaf) return { title, newLeaf: haveNext }; }); } console.log(loop(arr));Documentación adicional
Esta es una versión reduce , pero en realidad no reduce nada. Array.map es una mejor opción para este caso de uso.
Por cierto, su isLeaf y haveNext son literalmente incorrectos, sugiero que verifique a los children en su lugar.
Documentación Array.reduce zh-CN
const formatData = (data) => data.reduce((acc, {children, ...item}) => { let news = { ...item }; if (children && children.length > 0) { news.children = formatData(children); news.isLeaf = children.length === 0; } else { news.isLeaf = true; } acc.push(news); return acc; }, []) const arr = [{ title: 1, haveNext: false, children: [{ title: 2, haveNext: true, children: [{ title: 3, haveNext: true, }] }] }] console.log(formatData(arr))