【发布时间】:2011-07-01 14:58:21
【问题描述】:
如果我理解正确的话,ECMAScript 5 具有 Array 类型的 filter() 原型,但没有 Object 类型。
如何在 JavaScript 中为 Objects 实现 filter()?
假设我有这个对象:
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>
【问题讨论】:
-
你遇到了什么错误,具体来说?
-
您遇到了什么错误?如果可能的话发布它们:)
-
关于 jQuery 和扩展
Object.prototype: bugs.jquery.com/ticket/2721 的脚本的历史有点模糊 -
正是我需要的,除了你必须删除“!”在 !predicate(this[key]) 中有真正的过滤方法。
-
那些甚至提到扩展对象原型的人,不是实习生,得到我的建议立即被解雇。没有任何用例是理想的解决方案。你基本上是在用它重写语言,因为你把 JS 中的所有东西都拿来说:让我让它有点不同。是的,这种语言是迟钝的,让你弄乱它的最高原型,但你真的应该知道得更好。打个比方——想象一下,如果你开着你的车,让它变得有点不同。如果速度在 59 到 60 之间,休息将不再有效。
标签: javascript jquery object filtering