我正在开展一个学习项目,该项目要求我实现一个递归函数,该函数可以对传入的对象进行字符串化,而不使用 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 + "}";
}
};
它远非完美,因为我仍在学习,所以请让我知道我可以改进的地方以及使其按原样工作的任何帮助。
最佳答案
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/