我有一个像下面这样的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"
,因为没有匹配的值。
如何解决?
答案 0 :(得分:11)
您可以创建一个函数来执行正则表达式检查,如下所示:
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);
你可以更进一步,使它成为原型功能
Object.prototype.find = function(propertyName) {
return findValueOfProperty.bind(this, this);
};
并称之为
var result = map["Data center"]["TMSLevel2"].find(name);
console.log(result);
答案 1 :(得分:8)
这是一个快速黑客:
let map2 = JSON.parse(JSON.stringify(map).toUpperCase());
console.log(map2["DATA CENTER"]["TMSLEVEL2"]["COMP-NX3K"]);
这会丢失对象中值的情况,但看起来它们都是大写的,所以也许没问题?
答案 2 :(得分:6)
JavaScript对象属性区分大小写,这意味着JSON键也区分大小写。但是,假设您没有庞大的列表,那么您可以使用Object.keys
,Object.values
,并创建一个较低的索引。
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
的情况,您只会获得一个。
答案 3 :(得分:3)
您可以deep clone
将map
对象转换为另一个对象,并使用较低的所有键,并使用深度克隆对象中的小写键访问对象属性。
样品:
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"]);
答案 4 :(得分:1)
使用Object.defineProperty
的另一个不错的解决方案,借助此功能,您可以使用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"])
答案 5 :(得分:0)
规范你的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);
答案 6 :(得分:0)
我已经更改了我的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"
}
通过这种方式,它适用于极少数的键/组合。但是Object.keys
是一个更好的解决方案
答案 7 :(得分:0)
您可以尝试使用此代码。它可能会有所帮助。
var res= name.split("-")[0]+"-"+ name.split("-")[1].toUpperCase();
console.log(map["Data Center"]["TMSLevel2"][res]);