2

我正在尝试创建一个递归函数来过滤对象,具体取决于第二个传递参数中的属性。

过滤效果很好,但我的数组被替换为空对象。我可以做些什么来避免这种情况发生?

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: {}}
4

2 回答 2

1

在控制台上试试这个:

> typeof []
"object"

要更稳健地检查数组,您可以使用Object.prototype.toString

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

Object.prototype.toString对所有本机对象都有明确定义的行为,并且非常可靠。因此,例如,如果你想返回任何不是“真实”对象的东西,你可以这样写:

if (Object.prototype.toString(obj) !== "[object Object]") {
    return obj;
}
于 2012-10-16T17:09:57.977 回答
1

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

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

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

if(typeof obj !== "object" && !(obj instanceof Array)) { return obj; } 
于 2012-10-16T17:15:30.460 回答