[英]How to filter an json object by another object - Javascript
How can I filter a json object with another object in Javascript (cannot use JQuery) 如何用Javascript中的另一个对象过滤json对象(不能使用JQuery)
This is my JSON object 这是我的JSON对象
var jsondata = [
{
"firstName": "Sam",
"lastName": "Jones",
"age": "10"
},
{
"firstName": "Sam1",
"lastName": "Jones1",
"age": "10"
},
{
"firstName": "Sam2",
"lastName": "Jones2",
"age": "12"
},
{
"firstName": "Sam3",
"lastName": "Jones3",
"age": "13"
},
{
"firstName": "Sam4",
"lastName": "Jones4",
"age": "14"
},
{
"firstName": "Sam5",
"lastName": "Jones5",
"age": "15"
},
{
"firstName": "Sam",
"lastName": "Jones11",
"age": "16"
},
{
"firstName": "Sam6",
"lastName": "Jones6",
"age": "17"
},
{
"firstName": "Sam7",
"lastName": "Jones7",
"age": "18"
},
{
"firstName": "Sam8",
"lastName": "Jones8",
"age": "19"
},
{
"firstName": "Sam9",
"lastName": "Jones9",
"age": "20"
},
{
"firstName": "Sam10",
"lastName": "Jones10",
"age": "21"
},
{
"firstName": "Sam11",
"lastName": "Jones11",
"age": "22"
},
{
"firstName": "Sam12",
"lastName": "Jones12",
"age": "23"
}
]
The above is the filterable object, now below is the object for filtering 上面是可过滤的对象,现在下面是用于过滤的对象
var filterArray = [{"id":"firstName","value":["Sam"]},{"id":"lastName","value":["Jones"]}]
I need to check the the fields of json object (jsondata) like firstName, lastName and match the values of both objects. 我需要检查诸如firstName,lastName之类的json对象(jsondata)的字段,并匹配两个对象的值。
Suppose firstname field of jsondata will be compared with id of filterArray and their values will be matched. 假设将jsondata的firstname字段与filterArray的ID进行比较,并且它们的值将匹配。 Alongside lastname will also be compared.
旁边的姓氏也会被比较。
FInally I want to store the filtered object (after eliminating those which are not in filter in a variable). 最后,我要存储过滤后的对象(在变量中消除那些不在过滤器中的对象之后)。 How can I realize this functionality?
如何实现此功能? Please help.
请帮忙。
I need to implement this using plain JS, I cannot use Jquery. 我需要使用纯JS来实现,而不能使用Jquery。
You can use every
and includes
to make a boolean value that will work with filter()
. 您可以使用
every
和includes
来创建一个布尔值,该值将与filter()
。
For example: 例如:
var jsondata = [{"firstName": "Sam","lastName": "Jones","age": "10"},{"firstName": "Sam1","lastName": "Jones1","age": "10"},{"firstName": "Sam2","lastName": "Jones2","age": "12"},{"firstName": "Sam3","lastName": "Jones3","age": "13"},{"firstName": "Sam4","lastName": "Jones4","age": "14"},{"firstName": "Sam5","lastName": "Jones5","age": "15"},{"firstName": "Sam","lastName": "Jones11","age": "16"},{"firstName": "Sam6","lastName": "Jones6","age": "17"},{"firstName": "Sam7","lastName": "Jones7","age": "18"},{"firstName": "Sam8","lastName": "Jones8","age": "19"},{"firstName": "Sam9","lastName": "Jones9","age": "20"},{"firstName": "Sam10","lastName": "Jones10","age": "21"},{"firstName": "Sam11","lastName": "Jones11","age": "22"},{"firstName": "Sam12","lastName": "Jones12","age": "23"}] var filterArray = [{"id":"firstName","value":["Sam"]},{"id":"lastName","value":["Jones"]}] let filtered = jsondata.filter(item => // filter jsondata filterArray.every( f => // so every member of filter array f.value.includes(item[f.id])) ) // has a corresponding item[id] in value console.log(filtered)
The above filter says that for every
item in filterArray
you want the value
array to include the item keyed to id
. 上面的过滤器说,对于
filterArray
中的every
项目,您都希望value
数组包含键为id
的项目。 This will make it so the item in jsondata
needs to match all the criteria in filterArray
. 这将使它成为
jsondata
的项目需要匹配filterArray
中的所有条件。 If you add Sam1
and Jones1
to the arrays, you'll get two items in the filter. 如果将
Sam1
和Jones1
添加到数组,则将在过滤器中获得两项。
var jsondata = [{"firstName": "Sam","lastName": "Jones","age": "10"},{"firstName": "Sam1","lastName": "Jones1","age": "10"},{"firstName": "Sam2","lastName": "Jones2","age": "12"},{"firstName": "Sam3","lastName": "Jones3","age": "13"},{"firstName": "Sam4","lastName": "Jones4","age": "14"},{"firstName": "Sam5","lastName": "Jones5","age": "15"},{"firstName": "Sam","lastName": "Jones11","age": "16"},{"firstName": "Sam6","lastName": "Jones6","age": "17"},{"firstName": "Sam7","lastName": "Jones7","age": "18"},{"firstName": "Sam8","lastName": "Jones8","age": "19"},{"firstName": "Sam9","lastName": "Jones9","age": "20"},{"firstName": "Sam10","lastName": "Jones10","age": "21"},{"firstName": "Sam11","lastName": "Jones11","age": "22"},{"firstName": "Sam12","lastName": "Jones12","age": "23"}] var filterArray = [{"id":"firstName","value":["Sam", "Sam1"]},{"id":"lastName","value":["Jones", "Jones1"]}] let filtered = jsondata.filter(item => // filter jsondata filterArray.every( f => // so every member of filter array f.value.includes(item[f.id])) ) // has a corresponding item[id] in value console.log(filtered)
If any of the conditions in the filterArray are false then it will return false, otherwise it will return true. 如果filterArray中的任何条件为false,则它将返回false,否则将返回true。 Array.prototype.filter() will create a new array with items for which the function returned true.
Array.prototype.filter()将创建一个新数组,其中包含该函数返回true的项。
const jsondata = jsondata=[{firstName:"Sam",lastName:"Jones",age:"10"},{firstName:"Sam1",lastName:"Jones1",age:"10"},{firstName:"Sam2",lastName:"Jones2",age:"12"},{firstName:"Sam3",lastName:"Jones3",age:"13"},{firstName:"Sam4",lastName:"Jones4",age:"14"},{firstName:"Sam5",lastName:"Jones5",age:"15"},{firstName:"Sam",lastName:"Jones11",age:"16"},{firstName:"Sam6",lastName:"Jones6",age:"17"},{firstName:"Sam7",lastName:"Jones7",age:"18"},{firstName:"Sam8",lastName:"Jones8",age:"19"},{firstName:"Sam9",lastName:"Jones9",age:"20"},{firstName:"Sam10",lastName:"Jones10",age:"21"},{firstName:"Sam11",lastName:"Jones11",age:"22"},{firstName:"Sam12",lastName:"Jones12",age:"23"}]; const filterArray = [{"id":"firstName","value":["Sam"]},{"id":"lastName","value":["Jones"]}]; var match = jsondata.filter(function(element){ for(let i=0; i<filterArray.length; i++){ if(!filterArray[i].value.includes(element[filterArray[i].id])){ return false } } return true; }); console.log(match);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.