JavaScript:对象的filter() [英] JavaScript: filter() for Objects

查看:74
本文介绍了JavaScript:对象的filter()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

ECMAScript 5具有过滤器()原型,用于数组类型,但不包含对象类型,如果我理解正确的话。

ECMAScript 5 has the filter() prototype for Array types, but not Object types, if I understand correctly.

我如何实现 filter() JavaScript中的对象 s?

How would I implement a filter() for Objects in JavaScript?

假设我有这个对象:

var foo = {
    bar: "Yes"
};

我想写一个过滤器()适用于对象 s:

And I want to write a filter() that works on 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错误。

This works when I use it in the following demo, but when I add it to my site that uses jQuery 1.5 and jQuery UI 1.8.9, I get JavaScript errors in FireBug.

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

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

Horrible things will happen to your code. Things will break. You're extending all object types, including object literals.

以下是您可以尝试的简单示例:

Here's a quick example you can 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!"






而是创建一个传递对象的函数。


Instead create a function that you pass the object.

Object.filter = function( obj, predicate) {
    var result = {}, key;
    // ---------------^---- as noted by @CMS, 
    //      always declare variables with the "var" keyword

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

    return result;
};

这篇关于JavaScript:对象的filter()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆