如何不敏感地searchJSON文件的关键情况

我有一个像下面的JSON对象,

"Data Center": { "TMSLevel2": { "Comp-NX2/4/5/6K": "NX2/4/5/6K", "Comp-NX3K": "NX3K", "Comp-NX7K": "NX7K", "Comp-NX9K": "NX9K", "Comp-ACI": "ACI" } } 

我将该文件命名为map.js ,并通过Node JS的var map = require ('./map.js')将其导入。 我正在访问它像console.log(map["Data center"]["TMSLevel2"][name]) 。 现在名称是"Comp-NX3K""Comp-NX3k""Comp-nx3K"

当它是"Comp-NX3K"它打印相应的值。 但是,如果是"Comp-nx3K"则打印"undefined"因为没有匹配的值。 如何解决?

您可以创build一个函数来执行正则expression式检查,如下所示:

 function findValueOfProperty(obj, propertyName){ let reg = new RegExp(propertyName, "i"); // "i" to make it case insensitive return Object.keys(obj).reduce((result, key) => { if( reg.test(key) ) result.push(obj[key]); return result; }, []); } 

用法示例

 let result = findValueOfProperty(map["Data center"]["TMSLevel2"], name) console.log(result); 

你可以把它做成一个原型function

 Object.prototype.find = function(propertyName) { return findValueOfProperty.bind(this, this); }; 

并且像这样称呼它

 var result = map["Data center"]["TMSLevel2"].find(name); console.log(result); 

这是一个快速入门:

 let map2 = JSON.parse(JSON.stringify(map).toUpperCase()); console.log(map2["DATA CENTER"]["TMSLEVEL2"]["COMP-NX3K"]); 

这失去了对象中的值的情况,但它看起来像是所有的大写,所以也许没有问题?

JavaScript对象属性区分大小写,这意味着JSON密钥也是区分大小写的。 但是,假设您没有庞大的列表,那么可以使用Object.keysObject.values ,并创build一个较小的索引。

 var searchedFor = ("NX3K").toLowerCase(); // make sure to have them match case var data = { "Comp-NX2/4/5/6K": "NX2/4/5/6K", "Comp-NX3K": "NX3K", "Comp-NX7K": "NX7K", "Comp-NX9K": "NX9K", "Comp-ACI": "ACI" }; var iKeys = Object.keys(data) // this is a list of all of the attributed above (Comp-…) .map( // this calls a function on every member of an Array function(x){ // this function returns a lower cased version of whatever // value it was given return x.toLowerCase();}); // iKeys is now an array of lower-cased keys. var myValue = Object.values(data)[ // wherever the searched for element shows up, // will correspond to that value. iKeys.indexOf(searchedFor)]; 

我不得不警告你,以上只会匹配关键的第一个实例 。 所以如果有Comp-NX9KComp-nx9k你只能得到一个。

您可以将map对象deep clone到另一个对象,并将所有键设置在较低的位置,并使用深层克隆对象的小写键访问对象属性。

样品:

 var map = {"Data Center": { "TMSLevel2": { "Comp-NX2/4/5/6K": "NX2/4/5/6K", "Comp-NX3K": "NX3K", "Comp-NX7K": "NX7K", "Comp-NX9K": "NX9K", "Comp-ACI": "ACI" } }}; function clone(obj) { var cloned = {}; Object.keys(obj).forEach(function(key){ cloned[key.toLowerCase()] = (typeof obj[key] === 'object' ? clone(obj[key]) : obj[key]); }); return cloned; } var mapCloned = clone(map); console.log(mapCloned["data center"]["tmslevel2"]["comp-nx3k"]); 

另一个使用Object.defineProperty好的解决scheme,借助于这个,你可以克隆一个新的对象,并用下面的任何一个original keylower cased keyupper cased key来访问它的属性。 你也可以混合使用。

 var map = {"Data Center": { "TMSLevel2": { "Comp-NX2/4/5/6K": "NX2/4/5/6K", "Comp-NX3K": "NX3K", "Comp-NX7K": "NX7K", "Comp-NX9K": "NX9K", "Comp-ACI": "ACI" } }}; function defineProperty(obj, prop, val) { Object.defineProperty(obj, prop, { get: function() { return val; } }); } function clone(obj) { var cloned = {}; Object.keys(obj).forEach(function(key){ var val = obj[key]; if(typeof obj[key] === 'object') { val = clone(obj[key]); } defineProperty(cloned, key, val); if(key !== key.toLowerCase()) { defineProperty(cloned, key.toLowerCase(), val); } if(key !== key.toUpperCase()) { defineProperty(cloned, key.toUpperCase(), val); } }); return cloned; } var map = clone(map); console.log(map["data center"]["tmslevel2"]["comp-nx3k"]); // mixed console.log(map["Data Center"]["tmslevel2"]["comp-nx3k"]) // mixed more console.log(map["Data Center"]["TMSLevel2"]["comp-nx3k"]) 

规范你的JSON

 var map = [ {"Comp-NX2/4/5/6K": "NX2/4/5/6K"}, {"Comp-NX3K": "NX3K"}, {"Comp-NX7K": "NX7K"}, {"Comp-NX9K": "NX9K"}, {"Comp-ACI": "ACI"}, {"Comp-NX3k": "NX3k"}, {"Comp-nx3K": "nx3K"}, ]; var normalizeMap = []; for (var i=0;i<map.length;++i) { for (var key in map[i]) { //console.log(' name=' + key + ' value=' + map[i][key]); if (key == "Comp-NX3K" || key == "Comp-NX3k" || key == "Comp-nx3K") { var key_ = "Comp-NX3K"; var value = map[i][key]; } else { var key_ = key; var value = map[i][key]; } var item = {}; item[key_]=value; } console.log(item); normalizeMap.push(item); } console.log(normalizeMap); 

我改变了我的JSON文件,如下所示…

 var data = { "Comp-NX2/4/5/6K": "NX2/4/5/6K", "Comp-NX3K": "NX3K", "Comp-NX7K": "NX7K", "Comp-NX9K": "NX9K", "Comp-NX2/4/5/6k": "NX2/4/5/6K", "Comp-NX3k": "NX3K", "Comp-NX7k": "NX7K", "Comp-NX9k": "NX9K", "Comp-ACI": "ACI" } 

以这种方式,它适用于非常less量的键/组合。 但Object.keys是一个更好的解决scheme

你可以试试这个代码。 这可能会有所帮助。

 var res= name.split("-")[0]+"-"+ name.split("-")[1].toUpperCase(); console.log(map["Data Center"]["TMSLevel2"][res]);