15

オブジェクトのプロパティに基づいてオブジェクトを選択したいのですが、必ずしも同じプロパティではありません。言い換えると:

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

どちらの方法でも機能します。

ご参考までに、同じルーチンで実行したいさまざまなデータ セットがあるため、これを行っているので、各データセットに固有のプロパティでフィルター処理できるように、フィルター プロパティを一般化する必要があります。

ありがとう!

4

1 に答える 1

46

オブジェクトに与えられた任意の数のプロパティに対して機能する機能的なアプローチを次に示します。

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
于 2013-06-14T00:15:33.240 に答える