1

こんにちは、州ごとに並べられた特定の国の州のリストを生成するこのスマートなコードがあります ISO コード

countries = new Array();
{foreach from=$countries item='country'}
    {if isset($country.states)}
        countries[{$country.id_country|intval}] = new Array();
        {foreach from=$country.states item='state' name='states'}
            countries[{$country.id_country|intval}]['{$state.id_state|intval}'] = '{$state.name|escape:'htmlall':'UTF-8'}';
        {/foreach}
    {/if}
{/foreach}

ISOコードで注文されているので、結果はこれで大丈夫です

countries = new Array();
countries[10] = new Array();
countries[10]['53'] = 'AG';
countries[10]['54'] = 'AL';
countries[10]['55'] = 'AN';
countries[10]['56'] = 'AO';
countries[10]['58'] = 'AP';
countries[10]['93'] = 'AQ';
countries[10]['57'] = 'AR';
countries[10]['59'] = 'AT';
countries[10]['60'] = 'AV';
countries[10]['61'] = 'BA';
countries[10]['64'] = 'BG';
countries[10]['65'] = 'BI';
countries[10]['62'] = 'BL';
countries[10]['63'] = 'BN';
countries[10]['66'] = 'BO';
countries[10]['69'] = 'BR';
countries[10]['68'] = 'BS';
countries[10]['162'] = 'BT';
countries[10]['67'] = 'BZ';
countries[10]['70'] = 'CA';
countries[10]['72'] = 'CB';
countries[10]['73'] = 'CE';
countries[10]['76'] = 'CH';
countries[10]['156'] = 'CI';
countries[10]['71'] = 'CL';
countries[10]['81'] = 'CN';
countries[10]['77'] = 'CO';
countries[10]['79'] = 'CR';
countries[10]['78'] = 'CS';
countries[10]['74'] = 'CT';
countries[10]['75'] = 'CZ';
countries[10]['82'] = 'EN';

同じページに、選択したhtmlタグを設定するこのjavascriptがありますが、ISOコードではなくIDでオプションタグを注文し、理由がわかりません

$(document).ready(function(){
    $('select#id_country').change(function(){
        updateState();
    });
    updateState();
});

function updateState()
{
    $('select#id_state option:not(:first-child)').remove();
        var states = countries[$('select#id_country').val()];
        if( typeof(states) != 'undefined' )
        {
            for (indexState in states)
            {
                //ie bug fix
                if (indexState != 'indexOf')
                    $('select#id_state').append('<option value="'+indexState+'"'+ (idSelectedCountry == indexState ? ' selected="selected' : '') + '">'+states[indexState]+'</option>');
            }
            $('p.id_state:hidden').slideDown('slow');
        }
        else
            $('p.id_state').slideUp('fast');
}
4

1 に答える 1

0

問題は、ISO コードのオブジェクトが配列のように機能し、オブジェクトのように機能しないことです。数値インデックスを持つ配列にアイテムを追加すると、その配列に特定の順序で自動的に配置されます。これは、配列が JavaScript で機能する方法です。
たとえば、次のコードを Chrome のコンソールで試すと、次のようになります。

var arr = [];
arr[4] = "data"; //same for arr['4'] - javascript will convert it to arr[4]
arr;

次の結果が表示されます。

[undefined × 4, "data"]

つまり、5 つすべてのインデックス (0 から 4) が作成され、最初の 4 つが未定義になり、5 つ目 (インデックス 4) が設定した値になります。
ここで、4 より小さい別のインデックスを追加するとします。たとえばarr[2] = "Z Data";、配列は次のようになります。

[undefined × 2, "Z Data", undefined × 1, "data"]

ご覧のとおり、順序付けされた値は自然な配列の方法です (コンテンツと挿入順序に関係なく)。

あなたの場合、順序付けしたい場合は、それを完了するためのいくつかのオプションがあります:
1 - 最良のオプションは、データのオブジェクトを含む順序付けられた配列を作成することです:

var countries = new Array();
{foreach from=$countries item='country'}
    {if isset($country.states)}
        countries[{$country.id_country|intval}] = new Array();
        {foreach from=$country.states item='state' name='states'}
            countries[{$country.id_country|intval}].push({state_id: {$state.id_state|intval}, iso: '{$state.name|escape:'htmlall':'UTF-8'}'});
        {/foreach}
    {/if}
{/foreach}

次のようにコンパイルされます。

var countries = new Array();
countries[10] = new Array();
countries[10].push({id: 53, iso:'AG'});
countries[10].push({id: 54, iso:'AL'});
countries[10].push({id: 55, iso:'AN'});
countries[10].push({id: 56, iso:'AO'});
countries[10].push({id: 58, iso:'AP'});
countries[10].push({id: 93, iso:'AQ'});
countries[10].push({id: 57, iso:'AR'});
countries[10].push({id: 59, iso:'AT'});
countries[10].push({id: 60, iso:'AV'});
//etc...

2 - 別のオプションは、配列のインデックスの前に文字列を付けて、配列をオブジェクトに変換することです。

var countries = new Array();
{foreach from=$countries item='country'}
    {if isset($country.states)}
        countries[{$country.id_country|intval}] = {}; //object initialization
        {foreach from=$country.states item='state' name='states'}
            countries[{$country.id_country|intval}]['s{$state.id_state|intval}'] = '{$state.name|escape:'htmlall':'UTF-8'}';
        {/foreach}
    {/if}
{/foreach}

次のようにコンパイルされます。

var countries = new Array();
countries[10] = {};
countries[10]['s53'] = 'AG';
countries[10]['s54'] = 'AL';
countries[10]['s55'] = 'AN';
countries[10]['s56'] = 'AO';
countries[10]['s58'] = 'AP';
countries[10]['s93'] = 'AQ';
countries[10]['s57'] = 'AR';
countries[10]['s59'] = 'AT';
countries[10]['s60'] = 'AV';
//ect...

オブジェクトとして使用すると、設定した順序でリストが並べられます。

3 - このオプションは、配列もオブジェクトに変換することに関するものですが、今回はインデックスを値で切り替えます。

var countries = new Array();
{foreach from=$countries item='country'}
    {if isset($country.states)}
        countries[{$country.id_country|intval}] = {}; //object initialization
        {foreach from=$country.states item='state' name='states'}
            countries[{$country.id_country|intval}]['{$state.name|escape:'htmlall':'UTF-8'}'] = {$state.id_state|intval};
        {/foreach}
    {/if}
{/foreach}

次のようにコンパイルされます。

var countries = new Array();
countries[10] = {};
countries[10]['AG'] = 53;
countries[10]['AL'] = 54;
countries[10]['AN'] = 55;
countries[10]['AO'] = 56;
countries[10]['AP'] = 58;
countries[10]['AQ'] = 93;
countries[10]['AR'] = 57;
countries[10]['AT'] = 59;
countries[10]['AV'] = 60;
//ect...

4 - もちろん最良のオプションは、順序付けられたオブジェクト (オプション 1 で説明) をサーバー側 (PHP) で JSON にエンコードし、クライアント側 (JavaScript) でデコードすることですが、修正にはさらに時間がかかります。 .

JavaScript での配列の動作を理解していただければ幸いです。

幸運を!

于 2013-11-03T10:16:57.903 に答える