如何不敏感地搜索JSON文件的密钥大小写

时间:2016-11-21 05:10:54

标签: javascript json node.js

我有一个像下面这样的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",因为没有匹配的值。 如何解决?

8 个答案:

答案 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.keysObject.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-NX9KComp-nx9k的情况,您只会获得一个。

答案 3 :(得分:3)

您可以deep clonemap对象转换为另一个对象,并使用较低的所有键,并使用深度克隆对象中的小写键访问对象属性。

样品:

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 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"])

答案 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]);