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