Here I am calculating total length of the array using reduce array method.
I want to split the array into two arrays if the length exceed 30 so the new array will have total is as shown in the snippet 53 here so: two new [array1] = length will be 30 + [array2] = length will be 23
Any suggestions would be great:
let array = [ { "account": "0", "total": 1, "children": [ { "account": "A", "total": 1, "children": [], } ], }, { "account": "1", "total": 3, "children": [ { "account": "A", "total": 1, "children": [], }, { "account": "B", "total": 1, "children": [], }, { "account": "C", "total": 1, "children": [], } ], }, { "account": "2", "total": 3, "children": [ { "account": "A", "total": 1, "children": [], }, { "account": "B", "total": 1, "children": [], }, { "account": "C", "total": 1, "children": [], } ], }, { "account": "3", "total": 12, "children": [ { "account": "A", "total": 1, "children": [], }, { "account": "B", "total": 1, "children": [], }, { "account": "C", "total": 1, "children": [], }, { "account": "D", "total": 1, "children": [], }, { "account": "E", "total": 1, "children": [], }, { "account": "F", "total": 1, "children": [], }, { "account": "G", "total": 1, "children": [], }, { "account": "H", "total": 1, "children": [], }, { "account": "I", "total": 1, "children": [], }, { "account": "J", "total": 1, "children": [], }, { "account": "K", "total": 1, "children": [], }, { "account": "L", "total": 1, "children": [], }, ], }, { "account": "4", "total": 16, "children": [ { "account": "A", "total": 1, "children": [], }, { "account": "B", "total": 1, "children": [], }, { "account": "C", "total": 1, "children": [], }, { "account": "D", "total": 1, "children": [], }, { "account": "E", "total": 1, "children": [], }, { "account": "F", "total": 1, "children": [], }, { "account": "G", "total": 1, "children": [], }, { "account": "H", "total": 1, "children": [], }, { "account": "I", "total": 1, "children": [], }, { "account": "J", "total": 1, "children": [], }, { "account": "K", "total": 1, "children": [], }, { "account": "L", "total": 1, "children": [], }, { "account": "M", "total": 1, "children": [], }, { "account": "N", "total": 1, "children": [], }, { "account": "0", "total": 1, "children": [], }, { "account": "P", "total": 1, "children": [], }, ], }, { "account": "5", "total": 12, "children": [ { "account": "A", "total": 1, "children": [], }, { "account": "B", "total": 1, "children": [], }, { "account": "C", "total": 1, "children": [], }, { "account": "D", "total": 1, "children": [], }, { "account": "E", "total": 1, "children": [], }, { "account": "F", "total": 1, "children": [], }, { "account": "G", "total": 1, "children": [], }, { "account": "H", "total": 1, "children": [], }, { "account": "I", "total": 1, "children": [], }, { "account": "J", "total": 1, "children": [], }, { "account": "K", "total": 1, "children": [], }, { "account": "L", "total": 1, "children": [], }, ], }, ] const lengthOfChildren = array.reduce( (acc, val) => acc + val.children.length, 0); console.log(lengthOfChildren) const lengthOfArrayObjects = Object.keys(array).length; console.log(lengthOfArrayObjects) const totalLength = lengthOfChildren + lengthOfArrayObjects; console.log(totalLength)
Assuming each object has a children
property, one option could be to recursively loop the children of each object, aggregating the objects without the children property in a multidimensional array.
If the array has 30 items, add a new array to the resulting array.
To not return an empty array, you can remove those at the end using array filter.
For example
const splitChildrenToArrays = (source, result, limit) => {
const innerLoop = (source, result) => {
source.forEach(item => {
const {children, ...currObj} = item;
result[0].push(currObj);
if (result[0].length === limit) {
result.unshift([]);
}
innerLoop(item.children, result);
});
return result;
}
return innerLoop(source, result).filter(i => i.length > 0);
}
const result = splitChildrenToArrays(array, [[]], 30);
let array = [{ "account": "0", "total": 1, "children": [{ "account": "A", "total": 1, "children": [], }], }, { "account": "1", "total": 3, "children": [{ "account": "A", "total": 1, "children": [], }, { "account": "B", "total": 1, "children": [], }, { "account": "C", "total": 1, "children": [], } ], }, { "account": "2", "total": 3, "children": [{ "account": "A", "total": 1, "children": [], }, { "account": "B", "total": 1, "children": [], }, { "account": "C", "total": 1, "children": [], } ], }, { "account": "3", "total": 12, "children": [{ "account": "A", "total": 1, "children": [], }, { "account": "B", "total": 1, "children": [], }, { "account": "C", "total": 1, "children": [], }, { "account": "D", "total": 1, "children": [], }, { "account": "E", "total": 1, "children": [], }, { "account": "F", "total": 1, "children": [], }, { "account": "G", "total": 1, "children": [], }, { "account": "H", "total": 1, "children": [], }, { "account": "I", "total": 1, "children": [], }, { "account": "J", "total": 1, "children": [], }, { "account": "K", "total": 1, "children": [], }, { "account": "L", "total": 1, "children": [], }, ], }, { "account": "4", "total": 16, "children": [{ "account": "A", "total": 1, "children": [], }, { "account": "B", "total": 1, "children": [], }, { "account": "C", "total": 1, "children": [], }, { "account": "D", "total": 1, "children": [], }, { "account": "E", "total": 1, "children": [], }, { "account": "F", "total": 1, "children": [], }, { "account": "G", "total": 1, "children": [], }, { "account": "H", "total": 1, "children": [], }, { "account": "I", "total": 1, "children": [], }, { "account": "J", "total": 1, "children": [], }, { "account": "K", "total": 1, "children": [], }, { "account": "L", "total": 1, "children": [], }, { "account": "M", "total": 1, "children": [], }, { "account": "N", "total": 1, "children": [], }, { "account": "0", "total": 1, "children": [], }, { "account": "P", "total": 1, "children": [], }, ], }, { "account": "5", "total": 12, "children": [{ "account": "A", "total": 1, "children": [], }, { "account": "B", "total": 1, "children": [], }, { "account": "C", "total": 1, "children": [], }, { "account": "D", "total": 1, "children": [], }, { "account": "E", "total": 1, "children": [], }, { "account": "F", "total": 1, "children": [], }, { "account": "G", "total": 1, "children": [], }, { "account": "H", "total": 1, "children": [], }, { "account": "I", "total": 1, "children": [], }, { "account": "J", "total": 1, "children": [], }, { "account": "K", "total": 1, "children": [], }, { "account": "L", "total": 1, "children": [], }, ], }, ] const splitChildrenToArrays = (source, result, limit) => { const innerLoop = (source, result) => { source.forEach(item => { const { children, ...currObj } = item; result[0].push(currObj); if (result[0].length === limit) { result.unshift([]); } innerLoop(item.children, result); }); return result; } return innerLoop(source, result).filter(i => i.length > 0); } console.log(splitChildrenToArrays(array, [ [] ], 30));
I have wrote a flatten function here: which takes all the clildren and bring the nested level data in a single level:
let arrayofData = [ { "account": "0", "total": 1, "children": [ { "account": "A", "total": 1, "children": [], } ], }, { "account": "1", "total": 3, "children": [ { "account": "A", "total": 1, "children": [], }, { "account": "B", "total": 1, "children": [], }, { "account": "C", "total": 1, "children": [], } ], }, { "account": "2", "total": 3, "children": [ { "account": "A", "total": 1, "children": [], }, { "account": "B", "total": 1, "children": [], }, { "account": "C", "total": 1, "children": [], } ], }, { "account": "3", "total": 12, "children": [ { "account": "A", "total": 1, "children": [], }, { "account": "B", "total": 1, "children": [], }, { "account": "C", "total": 1, "children": [], }, { "account": "D", "total": 1, "children": [], }, { "account": "E", "total": 1, "children": [], }, { "account": "F", "total": 1, "children": [], }, { "account": "G", "total": 1, "children": [], }, { "account": "H", "total": 1, "children": [], }, { "account": "I", "total": 1, "children": [], }, { "account": "J", "total": 1, "children": [], }, { "account": "K", "total": 1, "children": [], }, { "account": "L", "total": 1, "children": [], }, ], }, { "account": "4", "total": 16, "children": [ { "account": "A", "total": 1, "children": [], }, { "account": "B", "total": 1, "children": [], }, { "account": "C", "total": 1, "children": [], }, { "account": "D", "total": 1, "children": [], }, { "account": "E", "total": 1, "children": [], }, { "account": "F", "total": 1, "children": [], }, { "account": "G", "total": 1, "children": [], }, { "account": "H", "total": 1, "children": [], }, { "account": "I", "total": 1, "children": [], }, { "account": "J", "total": 1, "children": [], }, { "account": "K", "total": 1, "children": [], }, { "account": "L", "total": 1, "children": [], }, { "account": "M", "total": 1, "children": [], }, { "account": "N", "total": 1, "children": [], }, { "account": "0", "total": 1, "children": [], }, { "account": "P", "total": 1, "children": [], }, ], }, { "account": "5", "total": 12, "children": [ { "account": "A", "total": 1, "children": [], }, { "account": "B", "total": 1, "children": [], }, { "account": "C", "total": 1, "children": [], }, { "account": "D", "total": 1, "children": [], }, { "account": "E", "total": 1, "children": [], }, { "account": "F", "total": 1, "children": [], }, { "account": "G", "total": 1, "children": [], }, { "account": "H", "total": 1, "children": [], }, { "account": "I", "total": 1, "children": [], }, { "account": "J", "total": 1, "children": [], }, { "account": "K", "total": 1, "children": [], }, { "account": "L", "total": 1, "children": [], }, ], },] const flatten = (into, node) => { if (node == null) return into; if (Array.isArray(node)) return node.reduce(flatten, into); into.push(node); return flatten(into, node.children); }; //count per page let detailsPageLimit = 30; let detailsOut = flatten([], [arrayofData]); let numberOfDivisonDetails = Math.ceil(detailsOut.length / detailsPageLimit); let divisionsDetails = []; for (let i = 0; i < numberOfDivisonDetails; i++) { if (detailsOut.length > detailsPageLimit) { divisionsDetails.push(detailsOut.splice(0, detailsPageLimit)); } else { divisionsDetails.push(detailsOut.splice(0, detailsOut.length)); } } console.log(divisionsDetails)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.