2016-08-19 2 views
0

Я прохожу json и key, чтобы получить функцию value. Ключ может быть как abc.cde.def, а также может быть как fgh.nodejs - извлекать значение из вложенных и не вложенных json

Если ключи содержат . то вложенная json и значения должны быть retirieved соответственно, которые правильно происходит, но если это простой json не имеющий гнездо, то он не работает. Печать длины keysData (в случае key, как FGH) печатает 3, где он должен напечатать 1.

function getValueFromJson(jsonInput,keyInput) { 
    if(keyInput.includes('.')){ 
     var keysData = keyInput.split('.'); 
    } 
    else { 
     keysData = keyInput.toString() 
    } 
    var jsonHierarchy = jsonInput; 
    if(parseInt(keysData.length) === parseInt('1')){   
     console.log(jsonHierarchy) 
     console.log(keysData) 
     console.log(jsonHierarchy[keysData ]) 
     jsonHierarchy = jsonHierarchy[keysData ]; 
    } 
    return jsonHierarchy; 
}; 

Может кто-нибудь, пожалуйста, помогите, как я могу справиться с этим?

+0

Вы получаете тот результат, потому что вы используете '.length' собственности на ключ в качестве строкового типа данных. Вы должны сделать свой 'keysInput' в массив –

ответ

2

вам не нужно, чтобы проверить if(keyInput.includes('.'))

вобще keyInput.split('.')

//for Ex. 
'abc.defg'.split('.') // result ['abc', 'defg'] 
'abc'.split('.') // result ['abc'] 

, а также

if(parseInt(keysData.length) === parseInt('1')) 

//can be used as 
if(keysData.length === 1) 

и ваша полная функция должна быть

function getValueFromJson(jsonInput,keyInput) { 
    var keysData = keyInput.split('.'); 

    var jsonHierarchy = jsonInput; 
    keysData.forEach(function(d) { 
     if(jsonHierarchy) 
      jsonHierarchy = jsonHierarchy[d]; 
    }) 
    return jsonHierarchy; 
}; 

var jsonData = { 
 
    'abc': { 
 
    'def': { 
 
     'gh': 'value1' 
 
    }, 
 
    'xyz': 'value2' 
 
    } 
 
}; 
 

 
function getValueFromJson(jsonInput, keyInput) { 
 
    var keysData = keyInput.split('.'); 
 

 
    var jsonHierarchy = jsonInput; 
 
    keysData.forEach(function(d) { 
 
    if (jsonHierarchy) 
 
     jsonHierarchy = jsonHierarchy[d]; 
 
    }) 
 
    return jsonHierarchy; 
 
}; 
 

 
function get() { 
 
    var val = document.getElementById('key').value; 
 
    if (val) 
 
    console.log(getValueFromJson(jsonData, val)); 
 
};
<input id="key" /> 
 
<button onclick="get()">Get Value</button>

+0

Это решило проблему, но я не смог получить значения, она дает 'undefined' – Abhinav

+0

обновил мой ответ. – Jag

+0

Я делаю то же самое, что и 'console.log (jsonHierarchy [keysData])', но он дает undefined – Abhinav

0

Преобразуйте свою строку в массив, а затем вашу длину с изображением должным образом.

var keysData = keyInput.split('.') 
+1

Весь блок' if/else' является избыточным, так как он возвращает массив с полной строкой в ​​любом случае, если он не находит совпадения. –

+0

Это решило проблему, но я не могу получить значения, она дает «undefined». – Abhinav

+0

@BenFortune вы на 100% правильны. –

Смежные вопросы