如果我理解正确,ECMAScript 5具有类型的filter()原型Array,但没有Object类型的原型。
filter()
Array
Object
如何在JavaScript中实现filter()for for Object?
假设我有这个对象:
var foo = { bar: "Yes" };
我想写一个filter()适用于Objects的:
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。
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; };