简体   繁体   English

如何通过另一个对象过滤json对象-Javascript

[英]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() . 您可以使用everyincludes来创建一个布尔值,该值将与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. 如果将Sam1Jones1添加到数组,则将在过滤器中获得两项。

 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.

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