简体   繁体   English

计算孩子总数和对象总数并分成不同的数组

[英]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.在这里,我正在使用 reduce 数组方法计算数组的总长度。

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如果长度超过 30,我想将数组拆分为两个 arrays,因此新数组的总数将如此处的代码段 53 所示:两个新的 [array1] = 长度将为 30 + [array2] = 长度为 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.假设每个 object 都有一个children属性,一个选项可以是递归循环每个 object 的孩子,在多维数组中聚合没有 children 属性的对象。

If the array has 30 items, add a new array to the resulting array.如果数组有 30 个项目,则将一个新数组添加到结果数组中。

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:我在这里写了一个扁平的 function :它采用所有的clildren并将嵌套的级别数据放在一个级别中:

 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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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