如何在Javascript中过滤json对象?

我有以下json字符串:

{ "Alarm":{ "Hello":48, "World":3, "Orange":1 }, "Rapid":{ "Total":746084, "Fake":20970, "Cancel":9985, "Word": 2343 }, "Flow":{ "Support":746084, "About":0, "Learn":0 } } 

然后我加载上面的字符串并将其转换为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); 

现在我如何通过键名过滤这个json对象? 例如,如果filter是“ange”,则过滤的对象将是:

 { "Alarm":{ "Orange":1 } } 

如果filter是“flo”,则过滤后的对象将变为:

 { "Flow":{ "Support":746084, "About":0, "Learn":0 } } 

如果filter是“wor”,结果将是:

 { "Alarm":{ "World":3, }, "Rapid":{ "Word": 2343 } } 

是否可以使用filter方法实现此过滤? 任何意见,将不胜感激。

您可以使用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')) 

除了给定的解决方案,您还可以使用递归样式来检查密钥。

此提议提供了在内部拥有更多嵌套对象并仅获取已过滤部分的机会。

 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')); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

使用filter方法我认为你的意思是Array#filter函数。 这不适用于对象。 无论如何,输入数据的解决方案可能如下所示:

 function filterObjects(objects, filter) { filter = filter.toLowerCase(); var filtered = {}; var keys = Object.keys(objects); for (var i = 0; i < keys.length; i++) { var key = keys[i]; if (objects.hasOwnProperty(key) === true) { var object = objects[key]; var objectAsString = JSON.stringify(object).toLowerCase(); if (key.toLowerCase().indexOf(filter) > -1 || objectAsString.indexOf(filter) > -1) { filtered[key] = object; } } } return filtered; }