我在递归javascript函数中做错了什么?

时间:2012-10-16 17:05:34

标签: 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], 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: {}}

2 个答案:

答案 0 :(得分:1)

在控制台上试试这个:

> typeof []
"object"

要更强大地检查数组,可以使用Object.prototype.toString

> Object.prototype.toString.call([])
"[object Array]"

Object.prototype.toString具有明确定义的所有本机对象的行为,并且非常可靠。因此,例如,如果要返回任何不是“真实”对象的内容,可以编写:

if (Object.prototype.toString(obj) !== "[object Object]") {
    return obj;
}

答案 1 :(得分:1)

数组的类型为object。因此,如果您想提前返回数组,则需要编辑此行:

if (typeof obj !== "object") { return obj; } 

有很多方法可以检查数组,但这就是我要做的:

if(typeof obj !== "object" && !(obj instanceof Array)) { return obj; }