(startNode: GeneralValue, selector: (node: GeneralValue) => GeneralValue | undefined, collector: GeneralValue[] = [])
| 16 | } |
| 17 | |
| 18 | export function recursiveDescend(startNode: GeneralValue, selector: (node: GeneralValue) => GeneralValue | undefined, collector: GeneralValue[] = []) { |
| 19 | // special treatment if it is an array |
| 20 | if (Array.isArray(startNode) && startNode.length > 0) { |
| 21 | for (const node of startNode) { |
| 22 | recursiveDescend(node, selector, collector); |
| 23 | } |
| 24 | return collector; |
| 25 | } |
| 26 | // it is an object we are interested in? |
| 27 | if (selector(startNode)) { |
| 28 | if (collector.indexOf(startNode) === -1) { |
| 29 | collector.push(startNode); |
| 30 | } |
| 31 | else { |
| 32 | return collector; // terminate, avoid endless looping because of circular reference |
| 33 | } |
| 34 | } |
| 35 | // recursiveDescend if possible |
| 36 | if (!isScalar(startNode)) { |
| 37 | for (const value of Object.values(startNode)) { |
| 38 | recursiveDescend(value, selector, collector); |
| 39 | } |
| 40 | return collector; |
| 41 | } |
| 42 | // its a scalar |
| 43 | // do nothing |
| 44 | } |
no test coverage detected