实现一个递归函数,将对象转换为javascript中的字符串

时间:2015-05-29 02:49:26

标签: javascript string object recursion

我有一个项目要求我将Object转换为字符串,而不使用stringify。这样做的目的是实现一个将对象转换为字符串的递归函数。我好像在这里遇到两个问题:

1)我将函数输出为字符串的函数,似乎只输出第一个值,而不是其余值。

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)我对上面的on循环的理解是它会打印对象中的每个键/值对,但它只对第一个键/值这样做。使用递归,我如何让它在每个键/值对上运行。

2 个答案:

答案 0 :(得分:2)

你在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 post抓取一个函数来测试变量是否是一个对象。您可能不希望在递归调用中包含数组。您可能想要打印其内容。 (但这是另一个问题嘿)然后你的代码变成这样:

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
}

通过一些缩进和字符串格式化,你应该顺利完成。

答案 1 :(得分:0)

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, "")调用此函数,它返回一个字符串。希望它可以帮助你或者给你一些递归写作的想法。