Как передать изменение значения в глобальную переменную(result)
Моей задачей было: вывести ссылку на значение, которое находиться в массиве. По типу:findPath(obj) === "subobj.arr.1.x"
С простыми значениями легко, но вот значение, которое находиться в объекте, в котором есть массив, другое дело. В codsandbox код работает без ошибок, но в node выкидывает ошибку, потому что result = undefined вне замыкания. Прошу помочь решить эту проблему: как можно перезаписать result, что бы логика кода не нарушалась или альтернативу моему коду, которое будет работать без подобных ошибок, и выполнять поставленную задачу. Вот условие задачи: Напишите функцию, принимающую к качестве аргумента объект с данными, и возвращающую путь, по которому в этом объекте находится поле со значением 15. В объекте всегда не больше одного значения 15.
function findPath(obj) {
var result;
function iter(o, p) {
return Object.keys(o).some(function(k) {
result = p.concat(Array.isArray(o) ? +k : k);
console.log(result);
return o[k] === 15 || (o[k] && typeof o[k] === 'object' && iter(o[k], result));
});
}
console.log(result);
return (iter(obj, []) && result).join('.') || null;
}
console.log(findPath({
field1: "hello, world",
name: "Johnny",
t: 99,
almostthere: "15",
subobj: {
name: 13,
arr: [
{ g: -4, k: 1 },
{ test: NaN, x: 15 },
],
},
test: "g",
}));
Ответы (1 шт):
function findPath(object, searchValue) {
let isFound = false;
const path = [];
const findProp = obj => Object.entries(obj).some(([key, val]) => {
isFound = isFound || (val === searchValue) // если искомое еще не найдено - сравним со значением текущего свойства...
|| ((typeof val === 'object') && findProp(val)); // ...а при неудаче сравнения и объектном типе тек. значения, выполним рекурсивный вызов
if (isFound) path.push(key); // когда искомое найдено, запоминаем фрагменты пути "на обратном пути" из рекурсивных вызовов
return isFound;
});
return !findProp(object) ? null : path.reverse().join('.');
}
const testObj = {
field1: "hello, world",
name: "Johnny",
t: 99,
almostthere: "15",
subobj: {
name: 13,
arr: [
{ g: -4, k: 1 },
{ test: NaN, x: 15 },
],
},
test: "g",
};
console.log(findPath(testObj, 15));