Как передать изменение значения в глобальную переменную(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 шт):

Автор решения: yar85

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));

→ Ссылка