Разница в синтаксисе функции, которую я не могу понять - PullRequest
1 голос
/ 29 марта 2020

Я писал функцию для логарифма поиска в ширину. Я бы придумал следующий код

traverseBF() {
        const results = []
        const queue = [this.root]
        while (queue.length) {
            let node = queue.shift()
            if (node.children) {
                queue.push(...node.children)
            }
            results.push(node)
        }
        return results
    }

Однако решение было написано несколько иначе, как

traverseBF(fn) {
        const queue = [this.root]
        while (queue.length) {
            let node = queue.shift()
            if (node.children) {
                queue.push(...node.children)
            }
            fn(node)
        }
    }

Я не могу объяснить, что такое цель fn(node) или как она возвращает правильный результат. Это какой-то рекурсивный вызов? Чем отличаются два решения?

1 Ответ

1 голос
/ 29 марта 2020

Вместо того, чтобы возвращать результаты, как вы, они позволяют пользователю передавать функцию, которая проходит каждый узел при его обходе.

Попробуйте, например:

obj.traverseBF(node => console.log(node))

Или просто

obj.traverseBF(console.log)

Должно работать так же. console.log дается каждому узлу для использования в том виде, в котором он найден.

Возможно, это более общее назначение. Если дерево было большим, накопление всех результатов в списке может привести к потере памяти, если пользователю не нужны все результаты сразу.

Если пользователь хочет собрать список, он может передать функция, которая добавляет к списку, над которым закрывается функция:

nodes = [];
obj.traverseBF(node => nodes.push(node))

console.log(nodes) 
...