【问题标题】:Implement a recursive function that converts an object to a string in javascript在javascript中实现一个将对象转换为字符串的递归函数
【发布时间】:2015-08-11 18:32:54
【问题描述】:

我有一个项目需要我将对象转换为字符串,而不使用 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) 我对上述 for in 循环的理解是,它会打印对象中的每个键/值对,但它只对第一个键/值这样做。使用递归,我怎样才能让它在每个键/值对上运行。

【问题讨论】:

  • 首先要改变的事情之一是摆脱document.write()。如果您想跟踪代码的执行,请使用console.log(),它会写入开发者控制台。
  • return 语句应该移到最后一行。否则它只会在 for 语句中运行一次。
  • 用调试器解决问题不会花很长时间吗?
  • 是的,但我正处于培训课程的早期阶段,需要我使用记事本来习惯这样的东西,所以有时我会错过它。

标签: javascript string object recursion


【解决方案1】:

你在 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
}

加上一些缩进和字符串格式,你应该会顺利进行。

【讨论】:

  • 谢谢大家,这个改变对我有用。您知道如何使用传递的对象将其变为递归函数吗?我在网上浏览了许多递归示例,但看不到任何涵盖此类内容的示例。
【解决方案2】:
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, "")调用这个函数,它返回一个字符串。希望它可以帮助您或给您一些想法来递归编写它。

【讨论】:

    猜你喜欢
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 2014-08-01
    • 2015-07-14
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    相关资源
    最近更新 更多