2016-11-21 12 views
9

Mam obiektu JSON jak poniżej,Jak szukać kluczową sprawę z plikiem JSON za insensititvely

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

nazwałem jak plik map.js i zaimportować go przez var map = require ('./map.js') od Węzła JS. Mam dostęp do niego jak console.log(map["Data center"]["TMSLevel2"][name]). Teraz nazwa to "Comp-NX3K" lub "Comp-NX3k" lub "Comp-nx3K".

Gdy jest to "Comp-NX3K", drukuje odpowiednią wartość. Ale jeśli jest to "Comp-nx3K", drukuje "undefined", ponieważ nie ma pasującej wartości. Jak to naprawić?

+0

masz na myśli mówiąc klucz json będą zmieniając go; s klucz lub podczas poszukiwania można zmienić to przypadek – brk

+5

nie ma nic do 'fix' - kod działa tak jak powinien, nie można„zrobić "javascript ignoruje przypadek dla kluczy obiektów. Możesz ustawić wszystkie klawisze małymi literami, następnie wybierz używając 'name.toLowerCase()' –

+0

Możesz rzucić okiem na moją odpowiedź, poniżej której użyłem 'Object.defineProperty' do miksowania i używania tak samo jak powyżej' map ["Dane Center "] [" TMSLevel2 "] [" comp-nx3k "]' – Aruna

Odpowiedz

11

Można by utworzyć funkcję zrobić czek regex tak:

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; 
    }, []); 
} 

Przykład użycia

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

Można przynieść krok dalej mój czyni go funkcję prototypu

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

i nazywają to jak tak

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

W atrybutach obiektów JavaScript jest rozróżniana wielkość liter, co oznacza, że ​​w kluczach JSON rozróżniana jest wielkość liter. Jednak zakładając, że nie masz olbrzymiej listy, możesz użyć Object.keys, Object.values i utworzyć indeks o małych liczbach.

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

muszę cię ostrzec, powyższe będzie pasował tylko pierwszej instancji klucza. Więc jeśli są przypadki Comp-NX9K i Comp-nx9k, dostaniesz tylko jeden.

+0

Możesz zrobić to funkcją, która sprawdza, czy dokładna wielkość liter nie jest niezdefiniowana, zanim obniżysz klawisze, które mogą pomóc, jeśli masz kolizje w danych. – Spaceman

8

Oto krótki Hack:

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

ten traci sprawę z wartości w obiekcie, ale wygląda na to, że wszystkie są wielkie litery, więc może nie ma problemu?

+1

To zadziała, ale jak już powiedziałem, to jest hack. Druga odpowiedź jest bardziej poprawna. –

3

Możesz deep clone obiektu do innego obiektu ze wszystkimi kluczami pisanymi małymi literami i uzyskać dostęp do właściwości obiektu za pomocą małych liter z głęboko sklonowanego obiektu.

Próbka:

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

0

normalizacji 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); 
1

Kolejną miłą rozwiązanie używając Object.defineProperty oraz z dzięki temu możesz sklonować nowy obiekt i uzyskać dostęp do jego właściwości za pomocą jednego z następujących original key, lower cased key i upper cased key jak poniżej. Możesz je również wymieszać.

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

0

zmieniłem mój plik JSON jak po ...

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" 
     } 

W ten sposób to działa na bardzo małą liczbę kluczy/kombinacje. Ale Object.keys jest lepszym rozwiązaniem.

0

Możesz spróbować tego kodu. To może być pomocne.

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