Preparation Code Preparation HTML (this will be inserted in the <body>
of a valid HTML5 document in standards mode) (useful when testing DOM operations or including libraries) <script >
const bigData = new Array (10 ).fill (0 ).map ((_, idx ) => {
const children = new Array (900 ).fill (0 ).map ((__, iidx ) => ({
label : `label-${idx} -${iidx} ` ,
value : `value-${idx} -${iidx} ` ,
children : [],
}));
return {
value : `value-${idx} ` ,
label : `label-${idx} ` ,
children,
};
});
function batchGetLeafNodes (nodes, childrenKey = 'children' ) {
const leafNodes = [];
const traverse = (node ) => {
if (node.isLeaf || !node[childrenKey].length ) {
leafNodes.push (node);
} else {
node[childrenKey].forEach (traverse);
}
};
nodes.forEach (traverse);
return leafNodes;
}
function getRooMultiCascaderValueByLeafValue (
nodes,
leafValues,
options,
) {
const {
valueKey = 'value' , childrenKey = 'children' , isAllLeafValue = false , isFirstLeafValue = false ,
} = options || {};
if (!(isAllLeafValue || isFirstLeafValue) && (!Array .isArray (leafValues) || !leafValues.length )) {
return [];
}
const result = [];
const traverse = (node ) => {
const currentValue = node[valueKey];
if (node.isLeaf || !node[childrenKey].length ) {
if (leafValues.includes (currentValue)) {
result.push (currentValue);
}
} else {
const leafs = batchGetLeafNodes (node[childrenKey]).map (
(item ) => item[valueKey],
);
if (leafs.every ((item ) => leafValues.includes (item))) {
result.push (currentValue);
} else {
node[childrenKey].forEach ((item ) => traverse (item));
}
}
};
const traverseFirst = (node ) => {
if (node.isLeaf || !node[childrenKey].length ) {
result.push (node[valueKey]);
} else {
node[childrenKey].forEach ((item ) => traverseFirst (item));
}
};
if (isAllLeafValue) {
return nodes.map ((item ) => item[valueKey]);
}
if (isFirstLeafValue) {
traverseFirst (nodes[0 ]);
return result;
}
nodes.forEach ((node ) => traverse (node));
return result;
}
function test1 ( ) {
const allLeaf = batchGetLeafNodes (bigData)
const val = getRooMultiCascaderValueByLeafValue (bigData, allLeaf);
}
</script >
Setup JS
Teardown JS