按名称获取JSON对象值

时间:2013-02-27 21:31:32

标签: javascript jquery json

我有一个有效的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
            }
        ]
    }
}

我有一个变量,用于存储unsuitable中可用选项的一个值(例如options)。 如何检索存储在变量中的值的requiresValidation字段的值,而不必遍历options内的所有对象值?

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

4 个答案:

答案 0 :(得分:2)

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

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

function getReqVal(val) {
    for (var item in mydata.reasons.options) {
       if(item.value == val) {
           return item.requiresValidation;
       }
    }
}

getReqVal("other");

需要注意的是,这将返回第一个,所以如果你有多个other,你就不会得到它们。

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

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

答案 1 :(得分:0)

如果您(或可能)正在使用underscore.js,则可以使用find方法:

var item = _.find(myObj.reasons.options, 
                  function(option){ return option.value == 'some value' });

答案 2 :(得分:0)

假设您无法更改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"

这里需要权衡的是,您的代码需要遍历整个选项数组一次,但之后您可以使用value键索引对象而无需搜索。使用this jsfiddle验证。

答案 3 :(得分:0)

您可以使用数组过滤器。一些变化:

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可以帮助您使用过滤器而不需要循环:http://api.jquery.com/jQuery.grep/