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で使用可能なオプションの1 つの値 (例: ) を格納する変数がありますoptionsrequiresValidation内部のすべてのオブジェクト値をループすることなく、変数に格納されている値のフィールドの値を取得するにはどうすればよいoptionsですか?

たとえば、var の内容がである場合、値が であるオブジェクトのフィールドotherにアクセスしたいと思います(これは です)。出来ますか?ありがとうございました。requireValidationothertrue

4

4 に答える 4

2

ここでは実際には JSON を扱っているのではなく、JS オブジェクトを扱っています。JSON は、JS オブジェクトを送信するための単なる形式です。

options配列です。アクセスする唯一の方法はインデックスによるものです。つまり、一度に 1 項目ずつ検索する必要があります。配列内の値の最初のインデックスを返すなどの関数があり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

配列フィルターを使用できます。これのいくつかのバリエーション:

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 に答える
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 の提案に従って、それを設計の新しいオブジェクトに読み込むことができます。理想的には、この新しいオブジェクトにより、キーを使用して options 配列にインデックスを付けることができます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"

ここでのトレードオフは、コードが options 配列全体を 1 回ループする必要があることですが、その後はvalue検索せずにキーを使用してオブジェクトにインデックスを付けることができます。この jsfiddleで検証します。

于 2013-02-27T21:53:22.340 に答える