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

标签 javascript arrays recursion

我正在开展一个学习项目,该项目要求我实现一个递归函数,该函数可以对传入的对象进行字符串化,而不使用 JSON.stringify。我必须将所有数据类型视为我的函数将接收的参数,虽然我对此很满意,但当传递数组/对象时我似乎感到困惑,并且我调用函数本身来迭代对象内容。 我做得不对,我所做的每一个改变都会影响我认为我已经完成的其他领域,所以我的挫败感开始赢得这场战斗。我需要帮助的领域:

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

  2. 当函数作为参数传递时该怎么做,这是不允许的。

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

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 + "}";
    }
};

它远非完美,因为我仍在学习,所以请让我知道我可以改进的地方以及使其按原样工作的任何帮助。

最佳答案

Output all elements of an array/object in the same way as JSON.stringify when I call the function on itself. An example of an issue I see is, if I pass an array like ["SO"], I am am getting [SO] returned, but it looks like I have that possibility covered!

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

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

What to do when a function is passed as a param, which is not allowed.

您需要检查传入的函数是否为 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 - twitter typehead.js 结果链接到 url

javascript - onkeyup 事件似乎没有触发或被忽略

java - 计算对象数组中的最小值,然后在另一个计算中使用它

javascript - 在 D3 视觉 (flare.json) 中获取指向被点击元素的路径

java - 如何使用java反转句子中的单词

javascript - 主干模型保存不起作用

javascript - `target="_blank"` 的替换?

perl - 在 Perl 中,如何将字节数组转换为 Unicode 字符串?

python - numpy:如何将函数应用于数组的每一行

c++ - 从递归堆栈帧返回时不保留值?