Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我的递归函数哪里出错了?_Javascript_Arrays_Recursion - Fatal编程技术网

Javascript 我的递归函数哪里出错了?

Javascript 我的递归函数哪里出错了?,javascript,arrays,recursion,Javascript,Arrays,Recursion,我正在进行一个学习项目,该项目要求我实现一个递归函数,该函数将传入的对象字符串化,而不使用JSON.stringify。我必须考虑所有数据类型作为我的函数将接收的参数,尽管我很好,但是当数组/对象通过时,我似乎变得困惑,并且我调用它自己的函数来迭代对象内容。 我做得不对,我所做的每一个改变都会影响到我认为我已经完成的其他领域,所以我的挫折感开始赢得这场战斗。我需要以下方面的帮助: 当我调用函数本身时,以与JSON.stringify相同的方式输出数组/对象的所有元素。我看到的一个问题示例是,如果

我正在进行一个学习项目,该项目要求我实现一个递归函数,该函数将传入的对象字符串化,而不使用JSON.stringify。我必须考虑所有数据类型作为我的函数将接收的参数,尽管我很好,但是当数组/对象通过时,我似乎变得困惑,并且我调用它自己的函数来迭代对象内容。 我做得不对,我所做的每一个改变都会影响到我认为我已经完成的其他领域,所以我的挫折感开始赢得这场战斗。我需要以下方面的帮助:

  • 当我调用函数本身时,以与
    JSON.stringify
    相同的方式输出数组/对象的所有元素。我看到的一个问题示例是,如果我传递一个类似
    [“SO”]
    的数组,我将返回
    [SO]
    ,但看起来我已经涵盖了这种可能性

  • 当函数作为参数传递时,该做什么,这是不允许的

  • 这是我到目前为止所拥有的。我感谢你能提供的任何帮助

    var myJSONRecursiveFunc = function (obj) {
    
        var stringed = "";
        var result;
    
        if (Number.isInteger(obj)) {
            return "" + obj + "";
        } else if (obj === null) {
            return "" + null + "";
        } else if (typeof obj === "boolean") {
            return "" + obj + "";
        } else if (typeof obj === "string") {
            return '"' + obj + '"';
        } else if (Array.isArray(obj)) {
            if (obj.length === 0) {
                return "[" + obj + "]";
            }
            for (var i = 0; i < obj.length; i++) {
                if (Array.isArray(i)) {
                    myJSONRecursiveFunc(i);
                } else {
                    stringed += "" + obj[i] + ""
                }
            }
            return result = "[" + stringed + "]";
        } else {
            for (var val in obj) {
                if (typeof val === "object") {
                    myJSONRecursiveFunc(val);
                }
                stringed += "" + val + "" + ":" + "" + obj[val] + "" + '';
            }
            return result = "{" + stringed + "}";
        }
    };
    
    var myJSONRecursiveFunc=函数(obj){
    var stringed=“”;
    var结果;
    if(编号isInteger(obj)){
    返回“+obj+”;
    }else if(obj==null){
    返回“+null+”;
    }else if(对象类型==“布尔”){
    返回“+obj+”;
    }else if(对象类型==“字符串”){
    返回“'+obj+'”;
    }else if(Array.isArray(obj)){
    如果(对象长度===0){
    返回“[”+obj+“]”;
    }
    对于(变量i=0;i
    这是远远不够完美,因为我仍在学习,所以请让我知道,我可以提高与任何帮助,使这项工作是如此

    在调用函数本身时,以与JSON.stringify相同的方式输出数组/对象的所有元素。我看到的一个问题示例是,如果我传递一个类似[“SO”]的数组,我将得到[SO]返回,但看起来我已经涵盖了这种可能性

    您在obj
    中递归的
    var val只传递
    val
    ,这是
    obj
    的关键。您需要调用
    myJSONRecursiveFunc(obj[val])
    以获得正确的结果。此外,对于您的阵列也是如此。if语句需要检查
    obj[i]
    是否是一个数组,而不是
    i
    ,后者只是一个整数。在这种情况下,您需要说:

    if (Array.isArray(obj[i])) {
      myJSONRecursiveFunc(obj[i])
    }
    
    当函数作为参数传递时,该做什么,这是不允许的

    您需要检查传入的函数是否是一个函数,使用
    typeof
    ,例如:
    if(typeof func==function)

    这是一个非常有趣的练习。几个月前我就这样做了,并且可以访问下划线库。以下是工作代码:

    var stringifyJSON = function(obj) {
      //Strings and null should be addressed here. Strings have quotes inside the string so I can't lump them together with booleans and numbers.
      if (_.isString(obj)){
        return '"' + obj.split('"').join('\\"') + '"';
      }
      if (_.isNull(obj)){
        return 'null';
      }
      //Arrays get a temporary array that their stringified elements get pushed to, and then that temporary array is joined together and concatenated with the brackets that exist within the returned string.
      if (_.isArray(obj)){
        var tempArr = [];
          _.each(obj, function(elem){
            tempArr.push(stringifyJSON(elem));
          });
        return '[' + tempArr.join(',') + ']';
      }
      //Objects get a temporary string to add their stringified data to. Including a check for undefined values and function keys.
      if (_.isObject(obj)){
          var tempArr = [];
          for (var k in obj){
            if (_.isUndefined(obj[k]) || _.isFunction(k)){
              return '{}';
            } else {
              tempArr.push(stringifyJSON(k) + ':' + stringifyJSON(obj[k]));
            }
          }
          return '{' + tempArr.join(', ') + '}';
      }
      //Everything else = booleans, numbers
      else {
        return obj.toString();
      }
    };
    
    好的,我们开始吧

    附加说明的建议 然后,在循环内部,
    else
    块返回
    “+obj[i]+”
    ,它将转换为
    “+”SO“+”
    ,然后转换为
    “SO”

    当返回时,
    “[“+”SO“+”]”
    将变为
    “[SO]”

    旁注:
    val
    实际上是键,所以这有点误导

    这是Javascript的一个丑陋的部分。如果修改了原始
    对象
    ,例如:
    Object.prototype.foobar=5
    ,则
    “foobar”:5
    将显示在程序中的每个对象中。值得注意的是,只有非常确定自己在做什么的开发人员才应该这样做,但这是可能的

    要确保这不会中断程序,请添加以下代码

    for( var key in obj ){
      if( ! obj.hasOwnProperty( key ) ){
        continue
      }
    }
    

    obj.hasOwnProperty()
    检查
    obj
    是否具有直接属性
    。如果没有,则使用
    continue

    myJSONRecursiveFunc(val)跳到下一个循环迭代---在代码的多个分支中,您不接受返回值。
    如果(u.isEmpty(obj)){
    不是必需的,则该分支是测试对象是否为空的专用分支。只需使用
    […]包装序列化内容即可
    ,这可能没什么。
    删除逗号
    是一个丑陋的解决方案。将所有内容累积到一个数组中,然后通过
    ,“
    加入。谢谢你的建议!我已经将它们纳入了代码中。@rkho感谢你的澄清。我完全理解你的意思,但由于某些原因,我在集中注意力时错过了它关于问题的更大方面,递归。我不知道为什么我在这方面遇到麻烦,但当我开始阅读你的答案时,我又意识到我做了什么。谢谢bunh@rkho这很简单-对于字符串,您必须用
    \”替换每个
    @zerkms不,我只是碰巧自己添加了一个较大的编辑。我很欣赏
    '“+key+”:“+toJSON(val)的捕获
    ,所以我一定要补充这一点。如果我错过了您的其他改进,我向您道歉。事实上,我后来意识到,您也应该
    toJSON
    键,因为该键可能包含双引号字符。@zerkms这是非常正确的。但是,这似乎是非常糟糕的做法。对于这种不太可能出现的边缘情况,我觉得最好不要混淆初出茅庐的开发人员需要更多。
    } else if( Array.isArray( obj ) ){
    
       for (var i = 0; i < obj.length; i++) {
            if (Array.isArray(i)) {
                myJSONRecursiveFunc(i);
            } else {
                stringed += "" + obj[i] + "" // <-- the error
            }
        }
    
    for( var val in obj ){
      // foo
    }
    
    for( var key in obj ){
      if( ! obj.hasOwnProperty( key ) ){
        continue
      }
    }