我在递归javascript函数中做错了什么?
我试图创建一个递归函数,根据第二个传递的参数中的属性过滤对象 过滤效果很好,但我的数组正在被空对象替换。我可以做些什么来避免这种情况发生我在递归javascript函数中做错了什么?,javascript,arrays,object,recursion,Javascript,Arrays,Object,Recursion,我试图创建一个递归函数,根据第二个传递的参数中的属性过滤对象 过滤效果很好,但我的数组正在被空对象替换。我可以做些什么来避免这种情况发生 var filter = function(obj, fields) { var key, o; if (typeof obj !== "object") { return obj;} o = {}; for (key in obj) { if (fields[key]) { o[key] = filter(obj[key
var filter = function(obj, fields) {
var key, o;
if (typeof obj !== "object") { return obj;}
o = {};
for (key in obj) {
if (fields[key]) {
o[key] = filter(obj[key], fields[key]);
}
}
return o;
};
data = {name: "John Doe", followers: [], notAllowedProp: false}
allowedFields = {name: true, followers: true}
console.log(filter(data, allowedFields));
// => Object { name: "John Doe", followers: {}}
在控制台上尝试以下操作:
> typeof []
"object"
要更可靠地检查数组,可以使用Object.prototype.toString
:
> Object.prototype.toString.call([])
"[object Array]"
Object.prototype.toString
对所有本机对象都有定义良好的行为,并且非常可靠。因此,例如,如果要返回任何不是“true”对象的内容,可以编写:
if (Object.prototype.toString(obj) !== "[object Object]") {
return obj;
}
数组具有类型
对象
。因此,如果要提前返回数组,则需要编辑此行:
if (typeof obj !== "object") { return obj; }
检查阵列的方法有很多,但我会这样做:
if(typeof obj !== "object" && !(obj instanceof Array)) { return obj; }
或者
[].constructor==Array
。虽然它们可以工作,但如果您使用对象.prototype.toString
@voithos,则肯定不会发生这种情况。如果您不使用以编程方式相互交互的iFrame,则可以使用instanceof
@PeterOlson:当然,但不管怎样,使用Object.prototype.toString
,这种情况都是有利的。从另一个角度来看,我认为Object.prototype.toString
比操纵typeof
和instanceof
更具可读性@pebbl:是的,你说的是duck类型,在大多数情况下这很好。无论字段类型如何,都返回空对象。我建议检查字段类型并通过它启动o。