$ .extend()=与服务器循环一起使用时不扩展

时间:2013-09-05 21:01:51

标签: javascript jquery object extend

我正在尝试创建2个空白对象,运行填充其中1个的php循环,然后将对象扩展到一起...最终创建一个内部有许多对象的对象。

这是逻辑/代码(注意,服务器的东西是专有的,但它运行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);
});

以下是页面上的内容:

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);
});

在函数结束时,控制台仅记录单个对象,即最后创建的对象。

知道我做错了什么吗?

4 个答案:

答案 0 :(得分:2)

$.extend正在将一个对象的属性复制到另一个对象。

我猜你需要一个数组

var allUsers = [];

 /* Push singleUser into allUsers */
 allUsers.push(singleUser);

答案 1 :(得分:2)

$ .extend将两个或多个对象的内容(字段)合并到第一个对象中。似乎allUsers应该不是哈希(对象)而是数组。 所以你会推动用户进入它:

var allUsers = [];

allUsers.push(singleUser);

答案 2 :(得分: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对象具有每个属性的值数组,请执行以下操作:

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

您需要自己动手。

您的问题的另一个解决方案可能是将allUsers保留为对象,但为每个用户对象使用键:

allUsers = {
    '1930039' = {
        'index'             : '0',
        'firstname'         : 'Devo',
        'lastname'          : 'Brown',
        ...
    },
    '1930025' = {
        'index'             : '1',
        'firstname'         : 'Aidan',
        'lastname'          : 'Roach',
        ...
    },
    ...
}

答案 3 :(得分:0)

var allUsers = [];
var singleUser = {};

$(document).ready(function(){
<fm:UserList 
    fields="id,firstname,lastname,geo_latitude,geo_longitude,meta,externalids"
    geo="notnull"
> 

    <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}'

        }
        /* push singleUser object into allUsers array */
        allUsers.push(singleUser);
    </fm:Loop>
</fm:UserList>