首页 > 解决方案 > 如何通过 Javascript 中的过滤器对象过滤对象数组?

问题描述

我是 Javascript 的新手,我得到了一个简单的任务,我似乎无法弄清楚。所以在我的作业中有一个这样的数据数组:

var data = [{
    "category": "catch",
    "Id": "3",
    "name": "Vertball Shoulder Catch"
}, {
    "category": "raise",
    "ID": "4",
    "name": "Vertball Raise",
    "area": ["hamstring", "lowerBack ", "arms"]
}, {
    "category": "slam",
    "ID": "5",
    "name": "Slamball Slams",
    "area": ["upperBack", "neck"]
}, {
    "category": "slam",
    "ID": "6",
    "name": "Slamball Burpee Slam",
    "area": ["hamstring", "lowerback ", "calves"]
}];

我需要编写一个方法,我可以在其中给出数组和一个要过滤的对象,这会给我来自数组的匹配值。

所以方法必须是这样的:

myMethod(array, objectToFilterOn){
//the logic

console.log("the results)
}

objectToFilterOn 可能与此不同:

{category:'raise'}

或这个:

{category:"raise", area:["lowerBack"]}

或用户想要的任何东西,这些只是示例。我希望它与输入一起返回包含任何内容的整个对象。

任何人都可以帮我解决这个问题或把我送到正确的方向,现在已经被困了一段时间了吗?

标签: javascriptfilter

解决方案


像这样的东西应该适用于 n-levels-depth 过滤器对象。

我已经"nestedObj": {...}为最后一个data条目添加了,其余没有变化。

const data = [{"category":"catch","ID":"003","name":"Vertball Shoulder Catch","area":["hamstring","lower_back ","buttocks"]},{"category":"raise","ID":"004","name":"Vertball Raise","area":["hamstring","lower_back ","buttocks"]},{ "category":"slam","ID":"005","name":"Slamball Slams","area":["shoulders","abdomen"]},
{
    "category": "slam",
    "ID": "006",
    "name": "Slamball Burpee Slam",
    "area": ["hamstring", "lower_back", "buttocks"],
    "nestedObj": {
      "name": "Tod",
      "nestedArea": ["dum", "bum"]
    }
}]

const filterByObject = (array, obj) => array.filter(e => 
  Object.entries(obj).every(([k, v]) => { switch(true) {
    case e[k] === v: // primitives equalition
      return true
    case Array.isArray(v): // arrays equaltion
      return v.every(x => e[k].includes(x))
    case typeof v === 'object': // recursive repeat if object
      return filterByObject(Object.entries(e[k]), v)
    default: return false // unhandled case (maybe there is any)
  }})
)

const filterObj = {
  category: "slam",
  area: ["hamstring", "buttocks"],
  nestedObj: {
    name: "Tod",
    nestedArea: ["dum"]
  }
}

const res = filterByObject(data, filterObj)

console.log(res)
.as-console-wrapper { max-height: 100% !important; top: 0; }


推荐阅读