3

これは、配列に入力すると、すべてのタイプの未定義のエントリも取得される配列を示すサンプルです。

これは firefox 19.0/firebug で発生したもので、他のブラウザで発生するかどうかは不明です。

基本的な流れ:

  1. オブジェクトが初期化されます (一番下)
  2. 「ロード」と呼びます
  3. ajax がロードで戻ると、data.objects には json オブジェクトの配列が含まれます。この配列には未定義のエントリはありません。
  4. setObjects が呼び出され、ajax 呼び出しからのすべてのオブジェクトが this.objects にコピーされます。
  5. それらがコピーされると、未定義のエントリがfirebugに表示されることがわかります。配列をもう一度渡さずに未定義のエントリをスプライスすると、テンプレート内の配列の要素にアクセスしようとすると口ひげが壊れます。

javascript が this.objects 配列に未定義のエントリを自動的に埋め込むのはなぜですか?

コードは次のとおりです。

function MailerFromProfile( )
{
    // privileged
    this.objects = [];
    this.load( );
}

MailerFromProfile.prototype.setObjects = function( objects )
{
    for( var i in objects )
    {
        if( 'undefined' !== objects[ i ] )
        {
            this.objects[ objects[ i ].id ] = objects[ i ];
        }
    }
    // I should not have to do this:
    for( var i = 0; i < this.objects.length; i++ )
    {
        if( typeof this.objects[ i ] === 'undefined' )
        {
            this.objects.splice( i, 1 );
            i--;
        }
    }
}

MailerFromProfile.prototype.setTemplate = function( n, v )
{
    this.template[ n ] = v;
}

MailerFromProfile.prototype.load = function( )
{
    jQuery.post(
        MAILER_PATH,
        { session: MAILER_SESSION,
          object : 'from_profile',
          action : 'list'
        },
        function( data )
        {
            if( typeof data.objects !== 'undefined' )
            {
                g_mailer_from_profiles.setObjects( data.objects );
            }
        },
        'json' );
}

var g_mailer_from_profiles = new MailerFromProfile( );
4

2 に答える 2

2

これを行うと

this.objects[ objects[ i ].id ] = objects[ i ];

this.objectsまで拡張する配列を要求しますobjects[ i ].idundefined埋められていないインデックスで要素が必要な場合にエンジンが提供する以外の解決策はありません。

配列がほとんど空 (スパース配列) の場合、代わりにオブジェクトをマップとして使用する必要があります。つまり、次のように初期化します。

this.objects = {};
于 2013-02-28T08:21:56.530 に答える