Я написал следующую функцию, чтобы пересечь JSON-структурированные данные, чтобы найти значение предоставленного targetField
и путей pathArr
, но я борюсь с возвратом результата из рекурсии, потому что значение для targetField может не существовать.JavaScript: результат возврата из рекурсии
Эта функция использует глобальную переменную с именем результат для возвращения значения в Таргет-филд, но это может увлекайтесь к следующему вызову findValue(), который не может найти значение, но показывает последний звонок-х result
. Поэтому мне интересно, что лучше всего решить эту проблему, не используя глобальную переменную result
.
Если вызов findValue() не находит значение targetField, просто верните null в качестве результата.
pathArr что-то вроде ["first_level", "second_level", "third_level"];
var result = null;
function findValue(jsonData, pathArr, targetField) {
if (pathArr.length == 0) {
result = targetField in jsonData ? jsonData[targetField] : result;
return result;
} else {
var curNode = pathArr.shift();
if (curNode in jsonData) {
jsonData = jsonData[curNode];
}
if (Array.isArray(jsonData)) {
jsonData.forEach(function(thisData) {
findValue(thisData, pathArr, targetField);
});
} else {
findValue(jsonData, pathArr, targetField);
}
}
return result;
}
Edit: Спасибо всем, кто ответил.
Используя усовершенствованный код unobf, я использовал этот Testdata сделать тестирование, но это только кажется, возвращая последний матч:
var testData = {
"num_found" : 3,
"category" : "social",
"groups": [
{"group" : {
"source" : [{"id" : "testID1", "num": 10, "field": "sociaology", "sub-subject" : "socialeconomy"},
{"id" : "testID2", "num": 20, "field": "mathematics", "sub-subject": ""},
{"id" : "testID3", "num": 7, "field": "biology", "sub-subject" : ""}
],
"identifier" : "shelf-01-E-XW1"
}},
{"group" : {
"source" : [{"id" : "testID4", "num": 50, "field": "sociaology2", "sub-subject" : ""},
{"id" : "testID5", "num": 44, "field": "mathematics2", "sub-subject": ""},
{"id" : "testID6", "num": 75, "field": "biology2", "sub-subject" : "european studies2"}
],
"identifier" : "shelf-02-W-EW3"
}},
{"group" : {
"source" : [{"id" : "testID7", "num": 59, "field": "sociaology3", "sub-subject" : "socialeconomy3"},
{"id" : "testID8", "num": 47, "field": "mathematics3", "sub-subject": ""},
{"id" : "testID9", "num": 76, "field": "biology3", "sub-subject" : "european studies3"}
],
"identifier" : "shelf-03-W-GW5"
}}
]
};
, и я обнаружил, что я должен был изменить эту строку кода
return {value : result};
к
return result;
Тест:
for (var i = 0; i < testData.groups.length; i++) {
var value = findValue(testData.groups[i], ["group", "source"], "sub-subject");
console.log("found value: " + value);
}
Посмотрите поиск в ширину (http://en.wikipedia.org/wiki/Breadth-first_search), и поиск в глубину (HTTP: //en.wikipedia.org/wiki/Depth-first_search), есть алгоритмы, которые объясняют, как это кодировать. – Patrick
Почему вы вызываете 'findValue' рекурсивно, не возвращая возвращаемого значения, вместо этого полагаясь на этот вызов, задавая глобальную переменную ('result')? –
Я считаю, что глобальная переменная приводит к временному решению. Сначала я попытался сузить масштаб результата переменной внутри функции, но это не сработало, но позвольте мне попробовать еще раз. – TonyGW