javascript - 我的递归函数在哪里出错?

标签 javascript arrays recursion

我正在做一个学习项目,要求我实现一个递归函数,该函数对传入的对象进行字符串化处理,而无需使用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 + "}";
    }
};


由于我仍在学习中,它还远远不够完美,所以请让我知道我可以在哪些方面进行改进以及使它按原样工作的任何帮助。

最佳答案

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


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

if (Array.isArray(obj[i])) {
  myJSONRecursiveFunc(obj[i])
}



  不允许将函数作为参数传递时该怎么办。


您需要检查传入的函数是否为带有typeof的函数,例如:if (typeof func === function)

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

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();
  }
};

关于javascript - 我的递归函数在哪里出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30552869/

相关文章:

javascript - 如何使用 jQuery 在页面中定位字符串/电子邮件地址

javascript - 尝试将菜单页面添加到 WordPress 管理站点

javascript - 我的情况下无法取消点击无法删除点击事件

javascript - 如何每隔一个项目添加带有类的div

java - 通过删除某些对象来压缩java中的数组

javascript - 在Javascript中遍历JSON对象时动态插入值

recursion - 如何反转列表?

c++ - 在 ''中请求成员 '',它是非类类型的

java - 两种打印所有排列的方法-返回与通过“结果”列表

C++ 递归查找数组的最小值