如何不敏感地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.keys
, Object.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-NX9K
和Comp-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 key
, lower cased key
和upper 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]);