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_name要素の jQuery インスタンスであるため、その要素にアクセスするためにselect使用します。childrenoptions

$.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が実際に配列になってしまう場合(文字どおりに記述したため、または のような 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プロパティ(生の要素を取得するには に注意してください) は、プロパティを持つ配列のようなオブジェクトであるため、インデックスを使用してループします。次に、が配列に存在するかどうかを確認します。ルックアップは 1 回しか行わないため、変数を使用してルックアップをキャッシュする必要はありません。select[0]length$.each$.inArrayoptionvaluemy_field_name

ただし、JSON 文字列が の場合は機能しないことに注意してください。そのような非配列オブジェクトでは機能しないためです{"0": "123", "1": "456", "2": "789"}$.inArray


以下のコメントを再確認してください。

...あなたの例では、まだ $("#my_field_name") を使用していますが、それは私が回避しようとしていたものです。これは、 $("#my_field_name") が既にスクリプトの上にキャッシュされているためです。そのフィールドを参照する必要があるたびに $("#my_field_name") を繰り返す代わりに var 名。

すでにやってるなら

var my_field_name = $("#my_field_name");

...コードのその上にある場合、当然、この回答の例のいずれかで、 が表示されている場合は$("#my_field_name")、 に直接置き換えることができますmy_field_name。たとえば、次のように表示されます。

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

すでに変数を持っmy_field_nameている場合は、これに変更できます。

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