如何过滤带有可变参数的javascript对象数组 [英] How to filter a javascript object array with variable parameters

查看:21
本文介绍了如何过滤带有可变参数的javascript对象数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I want to select the objects based on the properties of the objects, but not always the same properties. In other words:

arr = [
    { name: "joe",   age21: 1 },
    { name: "nick",  age21: 0 },
    { name: "blast", age21: 1 }
];

arr.filter(function(item) {
    return (item.name === "nick" && item.age21 === 1);
});

但有时我只想过滤名称,例如:

But sometimes I just want to filter on name for example:

arr.filter(function(item) {
    return (item.name === "nick");
});

我想要做的是概括这一点,以便可以将参数列表传递给函数.我想出了以下方法,但速度很慢,我想知道是否有更好的方法:

What I want to do is generalize this so that the list of parameters can be passed to the function. I've come up with the following, but it's slow and I'm wondering if there is a better way:

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

无论哪种方式都行.

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

In case you're wondering, I'm doing this because I have different data sets that I want to run through the same routine, so the filter properties need to be generalized so that I can filter on properties specific to each dataset.

谢谢!

推荐答案

以下是一种函数式方法,适用于给定对象的任意数量的属性:

Here's a functional approach that should work for any numbers of properties given the object:

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'}

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

Not sure about your performance issue, but this should be OK.

您可以使用正则表达式使其更强大,例如:

You could make this more powerful with regular expressions, something like this:

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: /^2d$/, color: /^(red|blue)$/ }));
//^ Louis, Greg                --^-- twenty-something
//                                               ----^---- red OR blue

这篇关于如何过滤带有可变参数的javascript对象数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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