You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

36 lines
705 B
JavaScript

"use strict";
const isIterable = require("is-iterable");
const forEach = require("../for-each");
module.exports = function treeMap(tree, mapper, options = {}) {
let key = options.key ?? "children";
let recurseAfterMap = options.recurseAfterMap ?? false;
let results = [];
function step(subtree) {
let mapped = mapper(subtree);
results.push(mapped);
let nextChildren = (recurseAfterMap)
? mapped[key]
: subtree[key];
if (isIterable(nextChildren)) {
forEach(nextChildren, step);
} else if (nextChildren != null && typeof nextChildren === "object") {
step(nextChildren);
}
}
if (isIterable(tree)) {
forEach(tree, step);
} else {
step(tree);
}
return results;
};