【发布时间】:2013-06-10 13:04:16
【问题描述】:
我想根据对象的属性选择对象,但并不总是相同的属性。换句话说:
arr = [
{ name: "joe", age21: 1 },
{ name: "nick", age21: 0 },
{ name: "blast", age21: 1 }
];
arr.filter(function(item) {
return (item.name === "nick" && item.age21 === 1);
});
但有时我只想过滤名称,例如:
arr.filter(function(item) {
return (item.name === "nick");
});
我想要做的是概括这一点,以便可以将参数列表传递给函数。我想出了以下方法,但速度很慢,我想知道是否有更好的方法:
filterParams = function(arr, params) {
var new_array = arr.filter(function(item) {
var select = 1
for(obj in params) { //create the filter criteria based on varying set of parameters
var select = select && params[obj] === item[obj];
}
return select;
});
return new_array;
}
然后你可以调用它:
filterParams(arr, {name: "nick", age21: 1});
或与:
filterParams(arr, {name: "nick"});
无论哪种方式都可以。
如果您想知道,我这样做是因为我有不同的数据集,我想通过相同的例程运行,因此过滤器属性需要通用化,以便我可以过滤特定于每个数据集的属性.
谢谢!
【问题讨论】:
-
“但它很慢” 你是如何衡量的?我们在谈论多少个元素?您可能已经可以通过将
obj设为本地而不是全局并在已经不匹配时停止比较属性(即break退出循环)来改进代码。如果您只是想改进代码,这个问题可能更适合codereview.stackexchange.com。 -
看起来很复杂的天哪。你确定你要这么做吗?为什么不直接写一个
filter_by_name和filter_by_age和filter_by_age_and_name(或者让它们可链接)。这看起来像是过早优化的情况。 -
哦,如果它失败了,那是个好主意。我想我说它是因为似乎必须有一种方法可以做到这一点,这是标准做法,但我不知道它是什么。我会把它移到那里。谢谢!
标签: javascript filter