0

私は 2 つの空のオブジェクトを作成し、そのうちの 1 つを埋める php ループを実行してから、オブジェクトを一緒に拡張しようとしています...最終的には、内部に多くのオブジェクトを持つ 1 つのオブジェクトを作成します。

ロジック/コードは次のとおりです(サーバーのものは独自のものですが、phpで実行され、正常に動作していることに注意してください):

var allUsers = {};
var singleUser = {};

$(document).ready(function(){

<fm:UserList 
    fields="id,firstname,lastname,geo_latitude,geo_longitude,meta,externalids"
> 

    <fm:Loop> 

        singleUser = {
            'index'             : '{$loop.index}',
            'id'                : '{$user.id}',
            'firstname'         : '{$user.firstname}',
            'lastname'          : '{$user.lastname}',
            'geo_latitude'      : '{$user.geo_latitude}',
            'geo_longitude'     : '{$user.geo_longitude}',
            'company'           : '{$user.meta.company}',
            'twitter'           : '{$user.meta.twitter}',
            'externalprovider'  : '{$user.externalids.0.external_id_provider}',
            'externalid'        : '{$user.externalids.0.external_parsed_id}'

        }
        /* Merge singleUser into allUsers */
        $.extend(allUsers,singleUser);

    </fm:Loop>
</fm:UserList>

console.log(allUsers);
});

get がページに配置する内容は次のとおりです。

var allUsers = {};
var setUser = {};

    $(document).ready(function(){

        setUser = {
            'index'             : '0',
            'id'                : '1930039',
            'firstname'         : 'Devo',
            'lastname'          : 'Brown',
            'geo_latitude'      : '-46.81610453612681',
            'geo_longitude'     : '-70.6640625',
            'company'           : 'Filemobile',
            'twitter'           : 'devinbrownca',
            'externalprovider'  : '',
            'externalid'        : ''

        }
        /* Merge setUser into passed allUsers */
        $.extend(allUsers,setUser);



        setUser = {
            'index'             : '1',
            'id'                : '1930025',
            'firstname'         : 'Aidan',
            'lastname'          : 'Roach',
            'geo_latitude'      : '51.032184898096396',
            'geo_longitude'     : '-108.6328125',
            'company'           : '',
            'twitter'           : '',
            'externalprovider'  : '',
            'externalid'        : ''

        }
        /* Merge setUser into passed allUsers */
        $.extend(allUsers,setUser);



        setUser = {
            'index'             : '2',
            'id'                : '1930024',
            'firstname'         : 'Devin',
            'lastname'          : 'Brown ',
            'geo_latitude'      : '42.89743256946478',
            'geo_longitude'     : '-101.6015625',
            'company'           : '',
            'twitter'           : '',
            'externalprovider'  : '',
            'externalid'        : ''

        }
        /* Merge setUser into passed allUsers */
        $.extend(allUsers,setUser);

console.log(allUsers);
});

関数の最後に、コンソールは 1 つのオブジェクト (最後に作成されたオブジェクト) のみをログに記録します。

私が間違っていることは何ですか?

4

4 に答える 4

2

$.extendあるオブジェクトのプロパティを別のオブジェクトにコピーしています。

配列が必要だと思います

var allUsers = [];

 /* Push singleUser into allUsers */
 allUsers.push(singleUser);
于 2013-09-05T21:07:17.453 に答える
1

この動作はまさに何をするかextendです。オブジェクトの新しいプロパティはsetUserに追加されますがallUsers、既存のプロパティは上書きされます。例えば:

    setUser = {
        'firstname'         : 'Devo',
        'index'             : '0',
    }
    $.extend(allUsers,setUser);

    setUser = {
        'index'             : '1',
        'id'                : '1930039'
    }
    $.extend(allUsers,setUser);

次のオブジェクトになります。

    allUsers = {
        'firstname'         : 'Devo',
        'index'             : '1',
        'id'                : '1930039'
    }

問題は、このコードで何をしたいのかということです。

単純にすべてのユーザーを追跡したい場合は、次のsetUserようにオブジェクトの配列を保持したいだけかもしれません:

allUsers = [
            {
               'id':'0',
                ...
            },
            {
               'id':'1',
                ...
            },
            {
               'id':'2',
               ...
            }
           ];

setUser次のように、すべてのオブジェクトをallUsers配列にプッシュするだけでこれを実現できます。

allUsers = [];

setUser = {...};
allUsers.push(setUser);

ただし、次のようallUsersに、各プロパティの値の配列を持つ 1 つのオブジェクトが必要な場合:

    allUsers = {
        'firstname'         : ['Devo', 'Aidan'],
        'index'             : ['0','1'],
        ...
    }

独自の関数をロールする必要があります。

あなたの問題に対する別の解決策はallUsers、オブジェクトとして保持することですが、各ユーザーオブジェクトにキーを使用することです:

allUsers = {
    '1930039' = {
        'index'             : '0',
        'firstname'         : 'Devo',
        'lastname'          : 'Brown',
        ...
    },
    '1930025' = {
        'index'             : '1',
        'firstname'         : 'Aidan',
        'lastname'          : 'Roach',
        ...
    },
    ...
}
于 2013-09-05T21:07:33.813 に答える