Mey*_*sam 6 javascript jquery json filter
我有以下json字符串:
{
"Alarm":{
"Hello":48,
"World":3,
"Orange":1
},
"Rapid":{
"Total":746084,
"Fake":20970,
"Cancel":9985,
"Word": 2343
},
"Flow":{
"Support":746084,
"About":0,
"Learn":0
}
}
Run Code Online (Sandbox Code Playgroud)
然后我加载上面的字符串并将其转换为json对象:
jsonStr = '{"Alarm":{"Hello":48,"World":3,"Orange":1},"Rapid":{"Total":746084,"Fake":20970,"Cancel":9985},"Flow":{"Support":746084,"About":0,"Learn":0}}';
var jsonObj = JSON.parse(jsonStr);
Run Code Online (Sandbox Code Playgroud)
现在我如何json通过键名过滤此对象?例如,如果过滤器是"ange",则过滤的对象将是:
{
"Alarm":{
"Orange":1
}
}
Run Code Online (Sandbox Code Playgroud)
如果过滤器是"flo",则过滤后的对象将变为:
{
"Flow":{
"Support":746084,
"About":0,
"Learn":0
}
}
Run Code Online (Sandbox Code Playgroud)
如果过滤器是"wor",结果将是:
{
"Alarm":{
"World":3,
},
"Rapid":{
"Word": 2343
}
}
Run Code Online (Sandbox Code Playgroud)
是否可以使用该filter方法实现此过滤?任何意见,将不胜感激.
Nin*_*olz 18
除了给定的解决方案,您还可以使用递归样式来检查密钥.
此提议提供了在内部拥有更多嵌套对象并仅获取已过滤部分的机会.
function filterBy(val) {
function iter(o, r) {
return Object.keys(o).reduce(function (b, k) {
var temp = {};
if (k.toLowerCase().indexOf(val.toLowerCase()) !== -1) {
r[k] = o[k];
return true;
}
if (o[k] !== null && typeof o[k] === 'object' && iter(o[k], temp)) {
r[k] = temp;
return true;
}
return b;
}, false);
}
var result = {};
iter(obj, result);
return result;
}
var obj = { Alarm: { Hello: 48, "World": 3, Orange: 1 }, Rapid: { Total: 746084, Fake: 20970, Cancel: 9985, Word: 2343 }, Flow: { Support: 746084, About: 0, Learn: 0 }, test: { test1: { test2: { world: 42 } } } };
console.log(filterBy('ange'));
console.log(filterBy('flo'));
console.log(filterBy('wor'));Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }Run Code Online (Sandbox Code Playgroud)
您可以通过创建函数reduce()和Object.keys(),将检查与键名indexOf(),并返回所需的结果.
var obj = {
"Alarm": {
"Hello": 48,
"World": 3,
"Orange": 1
},
"Rapid": {
"Total": 746084,
"Fake": 20970,
"Cancel": 9985,
"Word": 2343
},
"Flow": {
"Support": 746084,
"About": 0,
"Learn": 0
}
}
function filterBy(val) {
var result = Object.keys(obj).reduce(function(r, e) {
if (e.toLowerCase().indexOf(val) != -1) {
r[e] = obj[e];
} else {
Object.keys(obj[e]).forEach(function(k) {
if (k.toLowerCase().indexOf(val) != -1) {
var object = {}
object[k] = obj[e][k];
r[e] = object;
}
})
}
return r;
}, {})
return result;
}
console.log(filterBy('ange'))
console.log(filterBy('flo'))
console.log(filterBy('wor'))Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12892 次 |
| 最近记录: |