如何按数组/对象值的倍数过滤对象数组

How to filter array of object by multiples array/objects values

本文关键字:数组 对象 过滤 何按      更新时间:2023-09-26

我需要过滤一个对象数组,如下所示:

var models = [
    {
      "family": "Applique",
      "power":"8",
      "volt":"12",
      "color":"4100",
      "type":"E27",
      "ip":"20",
      "dimensions":"230x92"
    },
    {
      "family": "Lanterne",
      "power":"20",
      "volt":"230",
      "color":"2700",
      "type":"R7S",
      "ip":"44",
      "dimensions":"230x92"
    },
    {
      "family": "Applique",
      "power":"50",
      "volt":"230",
      "color":"",
      "type":"GU10",
      "ip":"20",
      "dimensions":"227x227"
    }
]

基于这样一个对象:

var filter = {
   "family":[
      "Applique", "Faretto", "Lanterne"
   ],
   "power":{
      "less":[
          "30"
      ],
      "greater":[
      ],
      "equal":[
      ]
   },
   "volt":[
      "12", "230"
   ],
   "color":[
   ],
   "type":[
   ],   
   "ip":[
      "20"
   ]
   "dimensions":[
   ],
}

因此,在这种情况下,结果可能是:

{
  "family": "Applique",
  "power":"8",
  "volt":"12",
  "color":"4100",
  "type":"E27",
  "ip":"20",
  "dimensions":"230x92"
}

我已经阅读了另一个链接:如何通过检查多个值来过滤数组/对象,但我似乎无法将其适应我的情况。

提前感谢!

编辑:现在没有请求"电源"属性的条件

编辑2:对不起,我忘了指出过滤器对象可以为单个属性有多个值,比如:

var filter = {
   "family":[
       "Applique", "Faretto", "Lanterne"
   ],
   ...
   "volt":[
        "12", "230"
   ],
   ...
}

使用Array.filterArray.indexOfObject.keys函数的解决方案:

var result = models.filter(function(obj){
    var matched = true;
    Object.keys(obj).forEach(function(k){
        if (k === "power") {  // The condition on "power" property is not requested now
            return false;
        }
        if (filter[k] && filter[k].length && filter[k].indexOf(obj[k]) === -1) {
            matched = false;
        }
    });
    return matched;
});
console.log(JSON.stringify(result, 0, 4));

console.log输出:

[
    {
        "family": "Applique",
        "power": "8",
        "volt": "12",
        "color": "4100",
        "type": "E27",
        "ip": "20",
        "dimensions": "230x92"
    }
]

尝试lodash的_.filter

对于大于/低于他们的过滤,这里给出这个例子:

_.filter(users, _.conforms({ 'age': _.partial(_.gt, _, 38) }));