2016-12-04 4 views
1

Имея строку JSON (укороченный):Javascript массив JSON выход

{"line_array":[{"short":"[common]","long":"undefined"},{"short":"_YES","long":"Yes"},{"short":"_NO","long":"No"},{"short":"_NOT","long":"Not "},{"short":"_SEARCH","long":"Search"},{"short":"_GO","long":"Go"}]} 

Я хотел бы иметь возможность вызвать функцию, которая возвращает «длинную» значение, основанное на «короткой» значение:

like:

var test= 'Say '+get_value("_YES"); 

Как это сделать?

Пробовал:

function f_lang(short_string) { 
    var obj = json_string; 
    var arr = []; 
    json = JSON.stringify(eval('(' + obj + ')')); //convert to json string 
    arr = $.parseJSON(json); //convert to javascript array 

    return arr['line_array'][short_string]; 
} 

не повезло

ответ

1

Используйте Array#find, чтобы найти объект, который содержит короткое значение. Обратите внимание, что Array#find не поддерживается IE. Поэтому, если вам нужна поддержка IE и/или вы делаете много конверсий, как это, вы должны пойти со словарным подходом.

var str = '{"line_array":[{"short":"[common]","long":"undefined"},{"short":"_YES","long":"Yes"},{"short":"_NO","long":"No"},{"short":"_NOT","long":"Not "},{"short":"_SEARCH","long":"Search"},{"short":"_GO","long":"Go"}]}'; 
 

 
var terms = JSON.parse(str); 
 

 
function get_value(short) { 
 
    var term = terms.line_array.find(function(o) { 
 
    return o.short === short; 
 
    }); 
 
    
 
    //in case the term isn't found, we'll prevent term.long from throwing an error 
 
    return term && term.long; 
 
} 
 

 
var result = get_value('_YES'); 
 

 
console.log(result);

Используя объект словаря

Создание словаря с Array#reduce, и использовать его:

var str = '{"line_array":[{"short":"[common]","long":"undefined"},{"short":"_YES","long":"Yes"},{"short":"_NO","long":"No"},{"short":"_NOT","long":"Not "},{"short":"_SEARCH","long":"Search"},{"short":"_GO","long":"Go"}]}'; 
 

 
var terms = JSON.parse(str); 
 

 
var termsDictionary = terms.line_array.reduce(function(d, t) { 
 
    d[t.short] = t.long; 
 
    return d; 
 
}, Object.create(null)); 
 

 
function get_value(short) { 
 
    return termsDictionary[short]; // you can use this expression without the function of course 
 
} 
 

 
var result = get_value('_YES'); 
 

 
console.log(result);

+0

дает TypeError: termsDictionary не определено на словарной примере – osomanden

+0

Используя его. * var terms = str; var termsDictionary = terms.line_array.reduce (function (d, t) { d [t.short] = t.long; return d; }, Object.создание (нуль)); функция get_value (короткий) { возвращение условияDictionary [короткий]; // вы можете использовать это выражение без функции, конечно } console.log (get_value ("_ YES")); * – osomanden

+0

дает TypeError: terms.line_array undefined [Узнать больше] – osomanden

0

С надлежащим анализируемым JSON вы можете использовать Array#find, функцию ES6.

function getValue(short_string) { 
 
    return (object.line_array.find(a => a.short === short_string) || {}).long; 
 
} 
 

 
var json_string = '{"line_array":[{"short":"[common]","long":"undefined"},{"short":"_YES","long":"Yes"},{"short":"_NO","long":"No"},{"short":"_NOT","long":"Not "},{"short":"_SEARCH","long":"Search"},{"short":"_GO","long":"Go"}]}', 
 
    object = JSON.parse(json_string), 
 
    test= 'Say '+getValue("_YES"); 
 

 
console.log(test);

ES5 с Array#some

function getValue(short_string) { 
 
    var value; 
 
    object.line_array.some(function (a) { 
 
     if (a.short === short_string) { 
 
      value = a.long; 
 
      return true; 
 
     } 
 
    }); 
 
    return value; 
 
} 
 

 
var json_string = '{"line_array":[{"short":"[common]","long":"undefined"},{"short":"_YES","long":"Yes"},{"short":"_NO","long":"No"},{"short":"_NOT","long":"Not "},{"short":"_SEARCH","long":"Search"},{"short":"_GO","long":"Go"}]}', 
 
    object = JSON.parse(json_string), 
 
    test= 'Say '+getValue("_YES"); 
 

 
console.log(test);

0

Другой вариант:

function f_lang(short_string) { 
 
    var obj = {"line_array":[{"short":"[common]","long":"undefined"},{"short":"_YES","long":"Yes"},{"short":"_NO","long":"No"},{"short":"_NOT","long":"Not "},{"short":"_SEARCH","long":"Search"},{"short":"_GO","long":"Go"}]}; 
 
    for (var i = 0; i < obj['line_array'].length; i++) { 
 
     if (obj['line_array'][i]['short'] == short_string) { 
 
     return obj['line_array'][i]['long']; 
 
     }; 
 
    } 
 
} 
 

 
console.log('Say ' + f_lang("_YES"));

0

Вы можете использовать Array.Filter

var haystack = {"line_array":[{"short":"[common]","long":"undefined"},{"short":"_YES","long":"Yes"},{"short":"_NO","long":"No"},{"short":"_NOT","long":"Not "},{"short":"_SEARCH","long":"Search"},{"short":"_GO","long":"Go"}]} 

console.log(haystack.line_array.filter(e => e.short === '_YES').long) 
0

пожалуйста, попробуйте ниже код

<script> 
var str = '{"line_array":[{"short":"[common]","long":"undefined"},{"short":"_YES","long":"Yes"},{"short":"_NO","long":"No"},{"short":"_NOT","long":"Not "},{"short":"_SEARCH","long":"Search"},{"short":"_GO","long":"Go"}]}'; 

var terms = JSON.parse(str); 

function get_value(short) { 
    return terms.line_array.filter(function(o) { 
     return o.short == short 
    }); 

    //in case the term isn't found, we'll prevent term.long from throwing an error 
} 

var result = get_value('_YES'); 

console.log(result); 
</script> 
Смежные вопросы