@VasilievAleksey

Как получить полный путь до значения в объекте JavaScript?

Есть объект:

{
    MainService: [
        {
            Id: "733",
            Name: "service",
            MainService: [
                {
                    Id: "238",
                    Name: "service 1",
                    Service: [
                        {
                            Id: "145",
                            Name: "Service 2"
                        }
                    ]
                }
            ]
        }
    ]
}


необходимо получить путь вида:

MainService.0.MainService.0.Service.0.id (Если не ошибаюсь то путь должен быть таким.)

До сервиса

Id: "145",
 Name: "Service 2"


пробовал делать через рекурсию

function recur(branch, str) {
    var str = str || '',
        item;
    for (item in branch) {
        console.log(item)
        if (typeof(branch[item]) === 'object') { 
            str += item;
            str = recur(branch[item], str);
        } else {
            str += item;
        }
    }
    return str;
}


Но тут все выходит в какую то кашу.

Буду очень благодарен за любую попытку помощи.
  • Вопрос задан
  • 3235 просмотров
Решения вопроса 1
@iShatokhin
JS developer
var isArray = Array.isArray || function (arr) {
  return Object.prototype.toString.call(arr) === "[object Array]";
}

var isObject = function (obj) {
  return Object.prototype.toString.call(obj) === "[object Object]";
}

function three (tr) {
  var paths = [];

  function findPath(branch, str) {
    Object.keys(branch).forEach(function (key) {
      if (isArray(branch[key]) || isObject(branch[key]))
        findPath(branch[key], str ? str + "." + key : key);
      else
        paths.push(str ? str + "." + key : key);
    });    
  }

  findPath(tr, "");
  return paths;
}


Вернет от вашего объекта такое:
[
  "MainService.0.Id", 
  "MainService.0.Name", 
  "MainService.0.MainService.0.Id", 
  "MainService.0.MainService.0.Name", 
  "MainService.0.MainService.0.Service.0.Id", 
  "MainService.0.MainService.0.Service.0.Name"
]
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Aliansys
@Aliansys
var obj = {
    MainService: [
        {
            Id: "733",
            Name: "service",
            MainService: [
                {
                    Id: "238",
                    Name: "service 1",
                    Service: [
                        {
                            Id: "145",
                            Name: "Service 2"
                        }
                    ]
                }
            ]
        }
    ]
};

function recur(branch, str_paths) {
    var paths = str_paths.paths || [],
        str = str_paths.str || '',
        item;
    for (item in branch) {
        console.log(item)
        if (typeof(branch[item]) === 'object' && branch[item] !== null) { 
            str += str.length ? '.' + item : item;
            recur(branch[item], {str: str, paths: paths});
        } else {
//            str += '.' + item;
            paths.push(str + '.' + item);
        }
    }
    return paths;
}

var res = recur(obj, {});
console.log('Final res: ', res);


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

["MainService.0.Id", 
"MainService.0.Name",
"MainService.0.MainService.0.Id", 
"MainService.0.MainService.0.Name", 
"MainService.0.MainService.0.Service.0.Id", 
"MainService.0.MainService.0.Service.0.Name"]
Ответ написан
DIITHiTech
@DIITHiTech
Fullstack javascript developer
И на массивах =)
var obj = {
    MainService: [
        {
            Id: "733",
            Name: "service",
            MainService: [
                {
                    Id: "238",
                    Name: "service 1",
                    Service: [
                        {
                            Id: "145",
                            Name: "Service 2"
                        }
                    ]
                }
            ]
        }
    ]
  };  

       function mapObject(obj,asArrays){
           var paths=[];

           function scan(obj,stack){
               var k, v, path;

               for(k in obj){
                   if(obj.hasOwnProperty(k)){
                       path=stack.concat([k]);
                       if((v=obj[k])!==null&&typeof v=='object'){
                           scan(v,path);
                       }else{
                           paths.push(asArrays?path:path.join('.'));
                       }
                   }
               }
           }
           scan(obj,[]);
           return paths;
       }

       console.warn(mapObject(obj));

       console.warn(mapObject(obj,true)); //вдруг где пригодиться ;)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы