简体   繁体   English

如何通过 Javascript 中的过滤器 object 过滤对象数组?

[英]How to filter in an array of objects by filter object in Javascript?

I am quite new in Javascript and I got a simple assignment, which I can't seem to figure out.我是 Javascript 的新手,我得到了一个简单的任务,我似乎无法弄清楚。 So in my assignment have a data array like this:所以在我的作业中有一个这样的数据数组:

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

I need to write a method where I can give the array and an object to filter on, which gives me the matching values from the array back.我需要编写一个方法,我可以在其中给出数组和一个 object 进行过滤,这会给我来自数组的匹配值。

So the method has to be something like:所以方法必须是这样的:

myMethod(array, objectToFilterOn){
//the logic

console.log("the results)
}

the objectToFilterOn can vary from this: objectToFilterOn 可能与此不同:

{category:'raise'}

or this:或这个:

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

or anything that the user would like, these are just examples.或用户想要的任何东西,这些只是示例。 I want it with the input to give back the whole objects that include anything with this.我希望它与输入一起返回包含任何内容的整个对象。

Can anyone help me fix this problem or send me in the right direction, been stuck on it for a while now?任何人都可以帮我解决这个问题或把我送到正确的方向,现在已经被困了一段时间了吗?

Something like this should work for n-levels-depth filter object.像这样的东西应该适用于 n 级深度过滤器 object。

I've added "nestedObj": {...} for last data entry, rest without a change.我添加了"nestedObj": {...}最后一个data输入,rest 没有改变。

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

 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"] }]; const objectToFilterOn = { category: 'slam', area: ["abdomen", "hamstring"] } function myMethod(array, objectToFilterOn) { const result = array.filter(el => { for (let key in objectToFilterOn) { if (Array.isArray(objectToFilterOn[key])) { if (el.hasOwnProperty(key) && Array.isArray(el[key])) { for (let strIndex in objectToFilterOn[key]) { if (el[key].find(s => s === objectToFilterOn[key][strIndex])) { return true; } } return false; } else { return false; } } else if (.el;hasOwnProperty(key) || (el[key];== objectToFilterOn[key])) { return false; } } return true; }). return result, } console;log(myMethod(data, objectToFilterOn));

You can use javascript Array filter method to filter your input array您可以使用 javascript 数组filter方法来过滤您的输入数组

data.filter(obj => obj.category === objectToFilterOn.category 
|| obj.ID === objectToFilterOn.ID 
|| obj.name === objectToFilterOn.name 
|| obj.areas?.some(el =>  objectToFilterOn?.includes(el)));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM