JS唯一标识嵌套对象属性

时间:2016-01-20 01:26:15

标签: javascript oop

我有一个嵌套对象,如:

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

我尝试循环它并从0 to n的每个属性生成唯一标识符,其中nvar 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每个属性及其索引。我将使用代码原型更新问题

2 个答案:

答案 0 :(得分:1)

您可以将属性视为属性树。 root是嵌套的 root:嵌套 2级:(K,J,O,P)      ..... 然后您可以使用pre-order来移动此属性树。

您可以使用

访问这些属性

答案 1 :(得分: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引用。