2016-01-20 2 views
-1

У меня есть вложенный объект, как:JS Уникально идентифицировать вложенные объекты свойства

var nested = { 
     k: 1, 
     j: { 
      i: 1, 
      k: 0 
     }, 
     o: function(a, bc) {}, 
     p: { 
      k: 0, 
      p: { 
      py: 0, 
      kg: 8 
      } 
     } 
     } 

И я стараюсь кольцуют и генерирует уникальный идентификатор из каждого свойства из 0 to n где n является общим количеством свойств var nested объект. Учитывая вышеизложенные var nested я ожидал что-то вроде:

var nested = { 
      k: 1, -> (0) 
      j: { -> (1) 
       i: 1, -> (2) 
       k: 0 -> (3) 
      }, 
      o: function(a, bc) {}, -> (4) 
      p: { -> (5) 
       k: 0, -> (6) 
       p: { -> (7) 
       py: 0, -> (8) 
       kg: 8 -> (9) 
       } 
      } 
      } 

Если более проще, то я хочу, чтобы подсчитать, сколько свойств делает (вложенный) объекта есть и console.log каждого свойства и его индекса. Я обновлю вопрос прототипом кода

+1

Каковы ожидаемые результаты? Не совсем понятно, что вы пытаетесь сделать ... или почему? Каков прецедент для этих идентификаторов? Также попробуйте показать, что вы пробовали – charlietfl

+0

Если проще, то я хочу подсчитать, сколько свойств имеет (вложенный) объект и 'console.log' каждое свойство и его индекс. Я обновлю вопрос прототипом кода. –

ответ

1

Вот способ для перебора вложенных объектов/массивов. Вы можете использовать сгенерированный путь, который передается обратному вызову в качестве уникального идентификатора, или вы можете перебирать счетчик в обратном вызове, когда вы идете или монете любой тип идентификатора, который вы хотите.

function iterateProperties(obj, fn, path) { 
 
    var newPath, prop, i; 
 
    path = path || "top"; 
 
    if (Array.isArray(obj)) { 
 
     for (var i = 0; i < obj.length; i++) { 
 
      newPath = path + "[" + i + "]"; 
 
      fn(newPath, obj[i]); 
 
      if (typeof obj[i] === "object") { 
 
       iterateProperties(obj[i], fn, newPath); 
 
      } 
 
     } 
 
    } else { 
 
     path += "."; 
 
     for (prop in obj) { 
 
      if (obj.hasOwnProperty(prop)) { 
 
       newPath = path + prop; 
 
       fn(newPath, obj[prop]); 
 
       if (typeof obj[prop] === "object") { 
 
        iterateProperties(obj[prop], fn, newPath); 
 
       } 
 
      } 
 
     } 
 
    } 
 
} 
 

 

 
var nested = { 
 
     k: 1, 
 
     j: { 
 
      i: 1, 
 
      k: 0 
 
     }, 
 
     o: function(a, bc) {}, 
 
     p: { 
 
      k: 0, 
 
      p: { 
 
      py: 0, 
 
      kg: 8 
 
      } 
 
     } 
 
     } 
 
     
 
iterateProperties(nested, function(path, val) { 
 
    log(path, " = ", val); 
 
}, "nested");
<script src="http://files.the-friend-family.com/log.js"></script>

Единственное требование объекта, переданного в эту функцию в том, что она не может иметь круговые OBJ ссылки.

+0

Идентификатор типа 'nested.p.p.kg' работает лучше всего. Спасибо! Мне было интересно, в чем проблема с круговыми ссылками? –

+0

@ValeriuMazare - Определенные типы круговых ссылок (где дочерний элемент относится к родительскому) вызовет бесконечный цикл, который в конечном итоге вызовет переполнение стека. Это можно защитить от лишнего кода. – jfriend00

1

, вы можете обрабатывать свойства как дерево свойств. корень в гнезде корень: гнездо 2-уровневое: (k, j, o, p) ..... 0 Вы можете использовать кнопки pre-order, чтобы путешествовать на этом дереве свойств.

вы можете посетить свойства, используя

Смежные вопросы