繁体   English   中英

实现将JavaScript中的对象转换为字符串的递归函数

[英]Implement a recursive function that converts an object to a string in javascript

我有一个项目,要求我在不使用stringify的情况下将Object转换为字符串。 其目的是实现将对象转换为字符串的递归函数。 我似乎在这里有2个问题:

1)我的函数以字符串形式输出Object,似乎仅输出第一个值,而不输出其余值。

function myToString(argObj) {
    var str = "";
    for (var val in argObj) {
        if (argObj.hasOwnProperty(val)) {
            str += val + " : " + argObj[val] + "\n";
            console.log(str);
        }
        return str;
    }
}

2)我对上面的for in loop的理解是,它将打印对象中的每个键/值对,但是仅对第一个键/值执行此操作。 使用递归,如何使它遍历每个键/值对。

您的返回值位于for循环内,这意味着它在第一次循环中返回。 尝试这个:

function myToString(argObj) {
    var str = "";
    for (var val in argObj) {
        if (argObj.hasOwnProperty(val)) {
            str += val + " : " + argObj[val] + "\n";
            document.write(str);
        }
    }
    return str;
}

之后,您想知道argObj的任何属性是否是对象,因此您可以递归地对它们中的任何一个调用该函数。 从这个SO帖子中获取一个函数来测试变量是否为对象。 您可能不想在递归调用中包括数组。 您可能要打印其内容。 (但这是另一个问题,嘿)然后您的代码将变成这样:

function myAndSomeGuyOnStackOverflowToString(argObj) {
    var str = "";
    for (var val in argObj) {
        if (argObj.hasOwnProperty(val)) {
            var propertyValue = argObj[val];
            if (isAnObject(propertyValue)){
                propertyValue = myAndSomeGuyOnStackOverflowToString(propertyValue)
            }
            str += val + " : " + propertyValue + "\n";
            document.write(str);
        }
    }
    return str;
}

function isAnObject(objArg){
   //choose your implementation from the many on that other post I mentioned
}

借助一些缩进和字符串格式,您应该可以顺利进行。

function myToString(argObj, res) {

    if ( argObj !== null && typeof argObj === "object") {
        for (var val in argObj)    
            res += val + " : " + argObj[val] + "\n";
    }

    if (typeof argObj === "number" || typeof argObj === "string")
        return res + argObj;

    return res;
}

通过调用myToString(object, "")调用此函数,它将返回一个字符串。 希望它可以帮助您或给您一些想法以递归方式编写它。

暂无
暂无

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

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