1. ホーム
  2. ジャバスクリプト

[解決済み】JavaScript:オブジェクトに対するfilter()

2022-03-28 01:38:27

質問

ECMAScript 5 では filter() 原型となる Array タイプではなく Object のタイプは、私の理解が正しければ

をどのように実装すればよいのでしょうか? filter() にとって Object をJavaScriptで作成することはできますか?

例えば、こんなオブジェクトがあるとします。

var foo = {
    bar: "Yes"
};

を書きたいし。 filter() を実行します。 Object s:

Object.prototype.filter = function(predicate) {
    var result = {};

    for (key in this) {
        if (this.hasOwnProperty(key) && !predicate(this[key])) {
            result[key] = this[key];
        }
    }

    return result;
};

以下のデモで使うとうまくいくのですが、jQuery 1.5 と jQuery UI 1.8.9 を使っているサイトに追加すると、FireBug で JavaScript エラーが発生します。

Object.prototype.filter = function(predicate) {
  var result = {};
  for (key in this) {
    if (this.hasOwnProperty(key) && !predicate(this[key])) {
      console.log("copying");
      result[key] = this[key];
    }
  }
  return result;
};

var foo = {
  bar: "Yes",
  moo: undefined
};

foo = foo.filter(function(property) {
  return typeof property === "undefined";
});

document.getElementById('disp').innerHTML = JSON.stringify(foo, undefined, '  ');
console.log(foo);
#disp {
  white-space: pre;
  font-family: monospace
}
<div id="disp"></div>

どのように解決するのか?

絶対に伸ばさない Object.prototype .

恐ろしいことがあなたのコードに起こるでしょう。モノは壊れるものです。拡張しています 何れも オブジェクトタイプ(オブジェクトリテラルを含む)。

ここでは簡単な例を挙げてみますので、試してみてください。

    // Extend Object.prototype
Object.prototype.extended = "I'm everywhere!";

    // See the result
alert( {}.extended );          // "I'm everywhere!"
alert( [].extended );          // "I'm everywhere!"
alert( new Date().extended );  // "I'm everywhere!"
alert( 3..extended );          // "I'm everywhere!"
alert( true.extended );        // "I'm everywhere!"
alert( "here?".extended );     // "I'm everywhere!"


代わりに、オブジェクトを渡す関数を作成します。

Object.filter = function( obj, predicate) {
    let result = {}, key;

    for (key in obj) {
        if (obj.hasOwnProperty(key) && !predicate(obj[key])) {
            result[key] = obj[key];
        }
    }

    return result;
};