2

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

配列には type がありobjectます。したがって、配列を早く返したい場合は、次の行を編集する必要があります。

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

配列をチェックする方法はたくさんありますが、これは私が行うことです:

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