简体   繁体   中英

count total number of children and the total number of objects and split into different array

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM