ECMAScript 5有filter()个原型,用于Array种类型,但如果我理解正确的话,不是Object种类型.

我如何在JavaScript中实现filter()forObjects?

假设我有这个对象:

var foo = {
    bar: "Yes"
};

我想写一个能在Object上工作的filter():

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.

你的代码会发生可怕的事情.事情会破裂的.您正在扩展all种对象类型,包括对象文字.

这里有一个您可以try 的快速示例:

    // 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;
};

Javascript相关问答推荐

React对话框模式在用户单击预期按钮之前出现

使用typeof运算符获取对象值类型-接收字符串而不是数组

仅在React和JS中生成深色

如何通过onClick为一组按钮分配功能;

成帧器运动中的运动组件为何以收件箱开始?

使用useup时,React-Redux无法找到Redux上下文值

Klaro与Angular的集成

django无法解析余数:[0] from carray[0]'

如何从JSON数组添加Google Maps标记—或者如何为数组添加参数到标记构造器

切换时排序对象数组,切换不起作用

如何从Intl.DateTimeFormat中仅获取时区名称?

如何在每次单击按钮时重新加载HighChart/设置HighChart动画?

类构造函数不能在没有用With Router包装的情况下调用

第二次更新文本输入字段后,Reaction崩溃

Reaction Redux&Quot;在派单错误中检测到状态Mutations

在Odoo中如何以编程方式在POS中添加产品

使用自动识别发出信号(&Q)

我为什么要使用回调而不是等待?

Angel Auth Guard-用户只有在未登录时才能访问登录页面,只有在登录时才能访问其他页面

REACT-本机错误:错误类型错误:无法读取未定义的容器的属性