javascript - 如何通过 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"]}
或用户想要的任何东西,这些只是示例。我希望它与输入一起返回包含任何内容的整个对象。
任何人都可以帮我解决这个问题或把我送到正确的方向,现在已经被困了一段时间了吗?
解决方案
像这样的东西应该适用于 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; }
推荐阅读
- apache-spark - Spark DataFrame(或DataSet)中两列的链接值
- vue.js - Vee Validate 阻止我的组件运行,errors.first 故障
- javascript - 如何从反应组件更改快速 API url
- r - 如何在 ggplot2 中使用线图和误差线绘制多个连续变量与因子的关系?
- r - 我无法使用 rbind 和 do.call 访问列表列表中的第三个列表
- php - 如何指定 wordpress 在默认位置以外的特定位置查找 wp-content 目录?
- c# - 为所有出现的 Rule().NotEmpty() 设置默认错误代码;
- c# - Ef Core,不同数据类型的多对多连接表复合键
- javascript - 对显示“不允许加载本地资源”错误的字符串使用 IndexOf() 方法
- javascript - 用js搜索字母的字符串