繁体   English   中英

JavaScript遍历对象属性-卡在循环引用循环中

[英]JavaScript Iterating over object properties - Stuck in circular reference loop

我有一个大物体(它具有大约200个属性),我想像这样打印它:

[property1: alice, property2: bob, property3: 42, ...]

如果该属性是一个函数,则希望它打印该函数的代码,如果它是一个数组,则希望它打印该数组的每个元素。 同样,如果该属性是一个对象,则还应该打印其属性,依此类推...

我试图递归地实现它,但是当然,调用栈很快就变得太大了。 然后我继续使用堆栈进行迭代实现。 这是我所拥有的:

function getPropertyString(obj) {
    var res = "";
    var stack = [];
    stack.push(obj);
    while(stack.length > 0){
        var object = stack.pop();
        res += "[";
        for(var prop in object) {
            if(prop == null) continue;
            if(typeof object[prop] === 'object') {
                stack.push(object[prop]);
            } else {
                res += prop + ": " + 
                       object[prop].toString().replace(/[\t\r\n]/g, "") + ", ";
            }
        }
        res += "],";
    }
    return res;
}

如果您有类似

var a = {
    b : {
        c : "hello",
        d : "world"
    },
    e : "alice",
    f : "bob",
    g : function() {
        console.log("hello");
    },
    h : [1, 2, 3]
}

但假设您修改a使ax = {}; axprototype = a; ax = {}; axprototype = a; 然后我的函数将陷入无限循环。

我该如何解决?

JSON.stringify首先如何JSON.stringify其传递给第二个参数(所谓的“替换器”),以便将方法也转换为字符串,因为默认情况下JSON.stringify会丢弃函数。 这样,您将拥有所有属性,并且如果设置了“无限循环”,那么JSON将提醒您有关此信息。

创建一个已从堆栈中处理过的对象数组,然后不再对其进行处理:(我标记了为此添加的行)

 function getPropertyString(obj) { var res = ""; var stack = []; var objectHistory = []; // added this stack.push(obj); while(stack.length > 0){ var object = stack.pop(); if (objectHistory.indexOf(object) != -1) continue; // added this objectHistory.push(object); // added this res += "["; for(var prop in object) { if(prop == null) continue; if(typeof object[prop] === 'object') { stack.push(object[prop]); } else { res += prop + ": " + object[prop].toString().replace(/[\\t\\r\\n]/g, "") + ", "; } } res += "],"; } return res; } var a = { b : { c : "hello", d : "world" }, e : "alice", f : "bob", g : function() { console.log("hello"); }, h : [1, 2, 3] }; ax = { i: "I am X" }; axprototype = a; console.log(getPropertyString(a)); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM