我需要制作一个简单的通用过滤器功能,以便对javascript事件进行“更改”搜索。
我有以下Json:
{
"name": "Ramsey Cummings",
"gender": "male",
"age": 12.5,
"address": {
"state": {
"post": "20042",
"name": "South Carolina"
},
"city": "Glendale"
}
}
如何制作通用方法以在我的对象中搜索所有叶子?
我添加了一个用户映射,我将传递给我的函数,例如:
this.filterDataMap = [
{
key: 'address', value: 'state.name'
}
]
我的过滤功能如下:
filterTable(array, value) {
let hash = [];
let objectProperties = Object.getOwnPropertyNames(array[0]);
$.grep(array, (item, i) => {
let isValidItem = false;
objectProperties.forEach(element => {
let mapElementArray = $.grep(this.filterDataMap, i => i.key === element);
if (mapElementArray.length > 0) {
debugger;
let mapperValue = ''.concat(element, '.', mapElementArray[0].value);
if (item[mapperValue] !== undefined &&
item[mapperValue].toString().toLowerCase().indexOf(value) !== -1 || !value)
isValidItem = true;
}
else if (item[element] !== undefined && item[element].toString().toLowerCase().indexOf(value) !== -1 || !value)
isValidItem = true;
});
if (isValidItem)
hash.push(item);
})
return hash;
}
我在这里的另一篇文章中发现,应该可以连接我的对象属性,如item ['address.state.name']但是当我这样做时,我得到了未定义的结果。
答案 0 :(得分:0)
我发现这是针对我的情况的 https://github.com/mariocasciaro/object-path
我的更新代码现在看起来像这样
filterTable(array, value) {
let hash = [];
let objectProperties = Object.getOwnPropertyNames(array[0]);
$.grep(array, (item, i) => {
let isValidItem = false;
objectProperties.forEach(element => {
let mapElementArray = $.grep(this.filterDataMap, i => i.key === element);
if (mapElementArray.length > 0) {
var objectPath = require("object-path");
let mapperValue = ''.concat(element, '.', mapElementArray[0].value);
if (objectPath.get(item, mapperValue) !== undefined &&
objectPath.get(item, mapperValue).toString().toLowerCase().indexOf(value) !== -1 || !value)
isValidItem = true;
}
else if (item[element] !== undefined && item[element].toString().toLowerCase().indexOf(value) !== -1 || !value)
isValidItem = true;
});
if (isValidItem)
hash.push(item);
})
return hash;
}