小编典典

JavaScript:对象的filter()

javascript

如果我理解正确,ECMAScript 5具有类型的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>

阅读 3402

收藏
2020-04-25

共1个答案

小编典典

永远不要扩展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;
};
2020-04-25