UNPKG

@wordpress/components

Version:
57 lines (54 loc) 1.54 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.buildTermsTree = buildTermsTree; /** * Internal dependencies */ const ensureParentsAreDefined = terms => { return terms.every(term => term.parent !== null); }; /** * Returns terms in a tree form. * * @param flatTerms Array of terms in flat format. * * @return Terms in tree format. */ function buildTermsTree(flatTerms) { const flatTermsWithParentAndChildren = flatTerms.map(term => ({ children: [], parent: null, ...term, id: String(term.id) })); // We use a custom type guard here to ensure that the parent property is // defined on all terms. The type of the `parent` property is `number | null` // and we need to ensure that it is `number`. This is because we use the // `parent` property as a key in the `termsByParent` object. if (!ensureParentsAreDefined(flatTermsWithParentAndChildren)) { return flatTermsWithParentAndChildren; } const termsByParent = flatTermsWithParentAndChildren.reduce((acc, term) => { const { parent } = term; if (!acc[parent]) { acc[parent] = []; } acc[parent].push(term); return acc; }, {}); const fillWithChildren = terms => { return terms.map(term => { const children = termsByParent[term.id]; return { ...term, children: children && children.length ? fillWithChildren(children) : [] }; }); }; return fillWithChildren(termsByParent['0'] || []); } //# sourceMappingURL=terms.js.map