プロトタイプ拡張を使用した JavaScript でのオブジェクト フィルタリング
ECMAScript 5 では、配列型に対して filter() メソッドが導入されましたが、オブジェクト型に対しては導入されませんでした。このため、JavaScript でオブジェクトの filter() メソッドを実装する方法について疑問が生じます。
カスタム オブジェクト フィルタの実装
1 つのアプローチは、次のように Object.prototype を拡張することです。カスタム filter() メソッド:
Object.prototype.filter = function (predicate) { var result = {}; for (var key in this) { if (this.hasOwnProperty(key) && !predicate(this[key])) { result[key] = this[key]; } } return result; };
この実装ではループを使用して、オブジェクト自身のプロパティを調べ、述語関数が各値に対して true または false を返すかどうかを確認します。 false の場合、キーと値のペアは結果オブジェクトに追加されます。
ただし、ネイティブ Object.prototype を拡張することは、他のライブラリやコードとの競合を引き起こす可能性があるため、悪い習慣とみなされます。
代替アプローチ
Object.prototype を拡張する代わりに、オブジェクトをフィルタリングするための代替アプローチがいくつかあります。 JavaScript の場合:
Object.filter = (obj, predicate) => Object.keys(obj) .filter((key) => predicate(obj[key])) .reduce((res, key) => (res[key] = obj[key], res), {});
Object.filter = (obj, predicate) => { const filteredValues = Object.keys(obj).map((key) => { if (predicate(obj[key])) { return [key, obj[key]]; } }).filter(Boolean); return Object.fromEntries(filteredValues); };
Object.filter = (obj, predicate) => { const filteredEntries = Object.entries(obj).filter( ([key, value]) => predicate(value) ); return Object.fromEntries(filteredEntries); };
例使用法
次のいずれかの代替方法を使用してオブジェクトをフィルタリングしてみましょう:
const scores = { John: 2, Sarah: 3, Janet: 1 }; // Using the `reduce` and `Object.keys` approach: const filteredScores = Object.filter(scores, (score) => score > 1); console.log(filteredScores); // { Sarah: 3 }
これらの代替方法を使用すると、ネイティブ プロトタイプを拡張せずに JavaScript でオブジェクトをフィルタリングできます。
以上がネイティブ プロトタイプを変更せずに JavaScript オブジェクトをフィルタリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。