我试图压缩和优化某些代码,并且我想要压缩以下类型,但无法获得正确的语法:
var my_field_name = $('#my_field_name'); // a multiple select
var my_array = {"0":"123","1","456","2":"789"};
my_array = $.parseJSON(my_array);
$.each(my_array, function (k, v) {
$("#my_field_name option[value="+v+"]").prop("selected", true);
}
到目前为止,一切工作都很顺利,但是我希望"在my_field_name
循环中使用$.each
,如my_field_name.("option[value="+v+"]").prop("selected", true);
,但这似乎是一种不正确的语法。
$("#my_field_name option[value="+v+"]")
是唯一的出路吗?
答案 0 :(得分:2)
由于my_field_name
是select
元素的jQuery实例,因此您使用children
来访问其options
元素:
$.each(my_array, function (k, v) {
my_field_name.children('option[value=' + v + ']').prop("selected", true);
}
...但请参见下文。
值得注意的是,您的my_array
变量未指向数组。实际上,该行是语法错误(因为您在"1"
之后使用逗号而不是冒号)。 (如果你使用冒号,你会得到一个带有"0"
,"1"
和"2"
键的对象,但它不是数组。当然,JavaScript aren't really arrays at all中的标准“数组”,但......)我想你想要:
var my_array = ["123", "456", "789"];
您也不要对非字符串的内容使用$.parseJSON
。
如果 my_array
实际上最终成为数组(要么是因为你是字面写的,要么是因为它是从{{1}这样的JSON字符串解析的}}),而不是使用["123", "456", "789"]
,你可能最好只循环选项:
children
原始// Let's assume you get jsonString from somewhere else, and it's really a string,
// as though you had this code: jsonString = '["123", "456", "789"]'
var my_array = $.parseJSON(jsonString);
$.each($("#my_field_name")[0].options, function(index, option) {
if ($.inArray(option.value, my_array) !== -1) {
option.selected = true;
}
});
DOM元素上的options
属性(注意要转到raw元素的select
)是一个类似于数组的对象,具有[0]
属性,所以length
将使用索引循环它。然后,$.each
会查看数组中是否存在$.inArray
的{{1}}。您不需要使用option
变量缓存查找,因为您只进行一次查找。
但请注意,如果JSON字符串为value
,则将不会工作,因为my_field_name
将无法与非数组对象一起使用。
重新评论以下内容:
...在你的例子中,你仍在使用$(“#my_field_name”),这就是我试图避免的,因为$(“#my_field_name”)已经缓存在脚本之上,尽管我我想在每次需要引用该字段时使用var名称而不是重复$(“#my_field_name”)。
如果你已经在做
{"0": "123", "1": "456", "2": "789"}
...在代码中位于其上方,然后自然在此答案的任何示例中,如果您看到$.inArray
,则可以直接将其替换为var my_field_name = $("#my_field_name");
。例如,如果您看到:
$("#my_field_name")
并且您已在变量中拥有my_field_name
,您可以将其更改为此内容;
$.each($("#my_field_name")[0].options, function(index, option) {