Когда совпадение не сразу найдено, вы вызываете рекурсивно функцию, которая должна в конечном итоге вернуть результат. Но это не так.
searchInTreeById(cursorChild, matchingId);
Однако, используя карту применит чек/функции для каждого ребенка, но результат теряется в любом случае, в этом случае. Функция map применяет функцию, заданную параметрами к элементам массива, и возвращает новое значение для каждого элемента - новый массив. В зависимости от того, как быстро элемент найден, копия дерева встроена в память (традиционная рекурсивная функция сохраняет только путь элементов до узла).
Таким образом, можно присвоить результат карты в массив, каждый элемент которой устанавливается в нуль если этот конкретный ребенок не имел спичку, или узла если найдено. Затем вы проверяете все элементы этого созданного массива и возвращаете нуль или узел, если он найден (тогда вызывающий заполняет массив на этом уровне и т. Д.).
Вы также можете использовать глобальную переменную
var found = null;
установить только тогда, когда есть совпадение (ничего сделано в противном случае). Так как кажется карта не прерывается, дети на этом уровне будут проверяться в любом случае. Но разница в том, что перед повторным вызовом функции снова вы проверяете глобальную переменную и вызываете только , если найдено по-прежнему не имеет значения.
Но возможно карте можно было бы избежать вместе?
Вместо того, чтобы использовать карту, собрать детей в массиве и перебрать этот массив, вызывать рекурсивно функцию и немедленно возвращать соответствие узла.
Предложенного код (не тестировался)
function searchInTreeById(node, matchingId) {
if (node.select('id').get() == matchingId) {
return node.get();
}
if (node.exists('childObjects')) {
var list = node.select('childObjects');
for(var i=0 ; i<list.length ; i++) {
var res = searchInTreeById(list[i], matchingId);
if (res) return res;
}
}
return null;
}
Отказ от ответственности: баобаба первого таймера. (Я прочитал this хотя)
Игнорирование результата 'searchInTreeById' выглядят очень подозрения (не уверен, что«баобаб»есть, так что, возможно, это нормально, что бы это ни было) –
@AlexeiLevenkov если я установить Рез = searchInTreeById (cursorChild, matchId), то func возвращает последний посещенный узел ... –
Боковое примечание: 'map' обычно является неправильным способом для выполнения поиска - скорее всего, есть другая функция (аналогичная' Array.find'), которая позволяет остановить итерацию в средний. –