我需要检查JSON中是否存在键值对。
filter: {department_Id: 20}
tk: {department_Id: 22, timekeeper_Name: "Tesvtda", office_Id: 2, position_Id: 1}
我可以检查对象中的过滤器键是否存在:
return tk.hasOwnProperty(Object.keys(filter)) ;
但是,我现在如何检查值?
完整功能:
filteredTimekeeperList: function() {
return this.timekeepersList.filter(tk => {
return this.filters.forEach(filter => {
console.log(filter, tk);
console.log(tk.hasOwnProperty(Object.keys(filter)));
return tk.hasOwnProperty(Object.keys(filter)) ; // True, now I need to return if both are matches
});
});
}
示例:https://codesandbox.io/s/y3xqo51wqv
Input:
timekeepersList: [
{
department_Id: 20,
timekeeper_Name: "Test",
office_Id: 1,
position_Id: 1
},
{
department_Id: 20,
timekeeper_Name: "Test",
office_Id: 1,
position_Id: 1
},
{
department_Id: 21,
timekeeper_Name: "Test",
office_Id: 1,
position_Id: 1
}
],
filters: [
{
department_Id: 21
}
]
Output:
{
department_Id: 21,
timekeeper_Name: "Test",
office_Id: 1,
position_Id: 1
}
您可以这样做:
这个想法是,如果给定的键的值与过滤器数组对象的值匹配,则要过滤timeKeepersList
。这是.some()
和.every()
将非常方便的地方。
使用.every()
将确保filters
数组中每个对象中的每个键都匹配给定计时员的键。如果> filters
阵列中的任何对象与TimeKeeper中的任何对象,则使用.some()
将返回给定的计时器。
您也可以根据您的情况将其混合并匹配。如果要返回计时器,如果任何对象匹配所有键,或者所有对象都匹配任何键。这些情况分别为.some() -> .every()
和.every() -> .some()
。
var timekeepersList = [
{
department_Id: 20,
timekeeper_Name: "Test",
office_Id: 1,
position_Id: 1
},
{
department_Id: 21,
timekeeper_Name: "Tesd332t",
office_Id: 1,
position_Id: 1
},
{
department_Id: 20,
timekeeper_Name: "Tesct123",
office_Id: 2,
position_Id: 2
},
{
department_Id: 21,
timekeeper_Name: "Tesat1ffg23",
office_Id: 2,
position_Id: 2
},
{
department_Id: 22,
timekeeper_Name: "Tesvtda",
office_Id: 2,
position_Id: 1
}
];
var filters = [{department_Id: 20}];
var filteredData = timekeepersList.filter(tk => {
// change .every to .some if you want partial matches
return filters.every(function (filter) {
// change .every to .some if you want partial matches
return Object.keys(filter).every(function (key) {
return tk[key] === filter[key];
});
});
});
console.log(filteredData);