Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按名称获取JSON对象值_Javascript_Jquery_Json - Fatal编程技术网

Javascript 按名称获取JSON对象值

Javascript 按名称获取JSON对象值,javascript,jquery,json,Javascript,Jquery,Json,我有一个有效的JSON对象,如下所示: { "reasons": { "options": [ { "value": "", "label": "Choose a reason", "selected": true, "requiresValidation": false },

我有一个有效的JSON对象,如下所示:

{
    "reasons": {
        "options": [
            {
                "value": "",
                "label": "Choose a reason",
                "selected": true,
                "requiresValidation": false
            },
            {
                "value": "small",
                "label": "Too little",
                "selected": false,
                "requiresValidation": false
            },
            {
                "value": "big",
                "label": "Too big",
                "selected": false,
                "requiresValidation": false
            },
            {
                "value": "unsuitable",
                "label": "I don't like it",
                "selected": false,
                "requiresValidation": true
            },
            {
                "value": "other",
                "label": "Other",
                "selected": false,
                "requiresValidation": true
            }
        ]
    }
}
我有一个变量,它存储了
选项
中可用选项的一个值(例如
不合适
)。 如何检索变量中存储的值的
requiresvalization
字段的值,而不必遍历
options
中的所有对象值

例如,如果var内容是
other
,我想访问值为
other
(即
true
)的对象的
requireValidation
字段。可能吗? 谢谢。

如果您正在(或可能正在)使用,您可以使用以下方法:


这里您并不是真正在处理JSON,而是在处理一个JS对象。JSON只是一种发送JS对象的格式

选项
是一个数组。访问它的唯一方法是通过索引,这意味着您必须一次搜索一个项目。有些函数,例如
indexOf()
,将返回数组中值的第一个索引,但是,您有一个对象数组,因此在这种情况下不起作用。(在内部,它仍在进行搜索)

需要注意的是,这将在第一个时返回,因此如果您有多个
其他
,您将无法获得它们

如果选项确实是唯一的值,我会将对象重新排列为关联数组,键是“值”项,值是包含其余数据的对象:

{
    "reasons": {
        "options": {
            "" : {
                "label": "Seleziona una voce",
                "selected": true,
                "requiresValidation": false
            },
            "small" : {
                "label": "Too little",
                "selected": false,
                "requiresValidation": false
            },
            "big" : {
                "label": "Too big",
                "selected": false,
                "requiresValidation": false
            },
            "unsuitable" : {
                "label": "I don't like it",
                "selected": false,
                "requiresValidation": true
            },
            "other" : {
                "label": "Other",
                "selected": false,
                "requiresValidation": true
            }
        }
    }
}

假设您无法更改JSON结构本身(因为您可能是从外部源获得的?),那么您可以根据Marc B的建议将其读入您设计的新对象中。理想情况下,这个新对象将允许您使用
value
键索引到选项数组中。让我们这样做:

function MyOptions(optionsJSON) {
    this.original_json = optionsJSON;
    this.length = optionsJSON.reasons.options.length;
    var original_options = optionsJSON.reasons.options;
    for(var i = 0; i < this.length; i++)
       this[original_options[i].value] = original_options[i];
}

var my_opts = new MyOptions(original_JSON);

var item_requiresValidation = my_opts["unsuitable"].requiresValidation;
console.log(item_requiresValidation); // should log "true"
函数MyOptions(optionsJSON){
this.original_json=optionsJSON;
this.length=optionsJSON.reasons.options.length;
var original_options=optionsJSON.reasons.options;
for(var i=0;i

这里的折衷是,您的代码需要在整个选项数组中循环一次,但在此之后,您可以使用
value
键索引到对象中,而无需搜索。使用进行验证。

您可以使用阵列过滤器。这方面的一些变化:

var $reasons = //Your JSON

function checkVal(element, index, array) {

    return (element.value == "other");
}

var filtered = $reasons.reasons.options.filter(checkVal);

alert(filtered[0].requiresValidation);

或者jQuery grep可以帮助您在不循环的情况下使用过滤器:

或者将JSON重新设计为不同的对象结构,或者您必须循环。您不直接处理JSON。这只是一种传输格式。将json转换回本机数据结构,然后只处理本机结构。e、 g.将json解码为javascript对象,然后就是
obj.reasons.options[i].requiresValidation
避免for循环的理由是什么?多亏了@epascarello,重新设计json才是最好的权衡。马克:我想实现这个目标,不需要转换。杰森:这只是一个优化的问题。真正的JSON更长,在页面内我必须循环多次。仅供参考:\在大多数常见情况下,查找使用循环实现。只需查看下划线源代码。谢谢,这是目前对我来说最好的解决方案!一个有效的建议,奥斯汀!。我选择了Jeff B提交的解决方案,因为我可以稍微修改JSON结构。
function MyOptions(optionsJSON) {
    this.original_json = optionsJSON;
    this.length = optionsJSON.reasons.options.length;
    var original_options = optionsJSON.reasons.options;
    for(var i = 0; i < this.length; i++)
       this[original_options[i].value] = original_options[i];
}

var my_opts = new MyOptions(original_JSON);

var item_requiresValidation = my_opts["unsuitable"].requiresValidation;
console.log(item_requiresValidation); // should log "true"
var $reasons = //Your JSON

function checkVal(element, index, array) {

    return (element.value == "other");
}

var filtered = $reasons.reasons.options.filter(checkVal);

alert(filtered[0].requiresValidation);