簡體   English   中英

如何使用可變參數過濾javascript對象數組

[英]How to filter a javascript object array with variable parameters

我想根據對象的屬性選擇對象,但不總是相同的屬性。 換一種說法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM