0

我正在尝试压缩和优化一些代码,并具有以下我想压缩的类型,但无法获得正确的语法:

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+"]")唯一的出路吗?

4

1 回答 1

2

由于my_field_nameselect元素的 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 中的标准“数组”根本不是真正的数组,但是...... ) 我想你想要:

var my_array = ["123", "456", "789"];

您也不要$.parseJSON在不是字符串的东西上使用。

如果 my_array实际上最终成为一个数组(因为您已经按字面意思编写了它,或者因为它是从像["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;
    }
});

options原始selectDOM 元素上的属性(注意[0]获取原始元素)是一个具有length属性的类数组对象,因此$.each将使用索引对其进行循环。$.inArray然后将查看option'svalue是否存在于数组中。您不需要使用my_field_name变量缓存查找,因为您只进行一次查找。

但请注意,如果 JSON 字符串是,那{"0": "123", "1": "456", "2": "789"}不起作用,因为$.inArray它不适用于这样的非数组对象。


在下面回复您的评论:

...在您的示例中,您仍在使用 $("#my_field_name") ,这是我试图避免的,因为 $("#my_field_name") 已经缓存在脚本之上,尽管我想使用var 名称,而不是每次我需要引用该字段时重复 $("#my_field_name") 。

如果你已经在做

var my_field_name = $("#my_field_name");

...在代码上方,然后自然在此答案中的任何示例中,如果您看到$("#my_field_name"),您可以直接将其替换为my_field_name. 例如,如果您看到:

$.each($("#my_field_name")[0].options, function(index, option) {

and you already have my_field_name in a variable, you can change it to this;

$.each(my_field_name[0].options, function(index, option) {
于 2013-02-25T14:07:22.693 回答