我有一个有效的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
字段。可能吗?
谢谢。
答案 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/