Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我在递归javascript函数中做错了什么?_Javascript_Arrays_Object_Recursion - Fatal编程技术网

我在递归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。