我正在尝试创建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);
});
在函数结束时,控制台仅记录单个对象,即最后创建的对象。
知道我做错了什么吗?
答案 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>