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