1

我有一个像这样的有效 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我想访问requireValidation其值为other(即true)的对象的字段。是否可以?谢谢你。

4

4 回答 4

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
            }
        }
    }
}
于 2013-02-27T21:41:25.073 回答
0

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

var item = _.find(myObj.reasons.options, 
                  function(option){ return option.value == 'some value' });
于 2013-02-27T21:38:20.813 回答
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键索引对象而无需搜索。使用此 jsfiddle进行验证。

于 2013-02-27T21:53:22.340 回答
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/

于 2013-02-27T21:59:27.670 回答