gpt4 book ai didi

javascript - 如何使用可变参数过滤javascript对象数组

转载 作者:可可西里 更新时间:2023-11-01 01:45:27 24 4
gpt4 key购买 nike

我想根据对象的属性来选择对象,但并不总是相同的属性。换句话说:

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"});

它会以任何一种方式工作。

如果你想知道,我这样做是因为我有不同的数据集,我想通过相同的例程运行,所以过滤器属性需要通用化,以便我可以过滤特定于每个数据集的属性.

谢谢!

最佳答案

这是一个函数式方法,它应该适用于给定对象的任意数量的属性:

function filter(arr, criteria) {
return arr.filter(function(obj) {
return Object.keys(criteria).every(function(c) {
return obj[c] == criteria[c];
});
});
}

例如:

var arr = [
{ name: 'Steve', age: 18, color: 'red' },
{ name: 'Louis', age: 21, color: 'blue' }, //*
{ name: 'Mike', age: 20, color: 'green' },
{ name: 'Greg', age: 21, color: 'blue' }, //*
{ name: 'Josh', age: 18, color: 'red' }
];

console.log(filter(arr, { age: 21, color: 'blue' }));
//^ {age:21, color:'blue', name:'Louis}
// {age:21, color:'blue', name:'Greg'}

不确定您的性能问题,但这应该没问题。

编辑:您可以使用正则表达式使其更强大,如下所示:

function filter(arr, criteria) {
return arr.filter(function(obj) {
return Object.keys(criteria).every(function(c) {
return new RegExp(criteria[c]).test(obj[c]);
});
});
}

console.log(filter(arr, { age: /^2\d$/, color: /^(red|blue)$/ }));
//^ Louis, Greg --^-- twenty-something
// ----^---- red OR blue

关于javascript - 如何使用可变参数过滤javascript对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17099029/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com