我有一个数组,一个包含所有具有唯一ID的用户的列表。我有一个包含所选组信息的对象。部分信息是所有者ID。我想知道,如何根据群组所有者ID获取用户的信息?例如,学生组对象的所有者ID为70,我的网站上有一个用户,其ID是70 ...我该如何匹配它们?
users:
[ {
id: 68
name: mike
domain: i:0#.f|admembers|mike.ca
email: mike.ca
isAdmin: False
}, etc etc ]
selectedGroup: {
name: Students
id: 78
description:
owner: 70
ownerIsUser: True
}
答案 0 :(得分:20)
您必须循环浏览users
:
var i = users.length,
ownerData;
while(i--) {
if(selectedGroup.owner == users[i].id) {
ownerData = users[i];
break;
}
}
或者您可以使用Array.filter()
:
var ownerData = users.filter(function(user) {
return user.id === selectedGroup.owner;
})[0];
答案 1 :(得分:7)
在ECMAScript 6中,您可以使用原生Array.find
method:
var selectedUser = users.find( function( user ){
return user.id === 70;
} );
目前只看到最新的Firefox支持此功能,您可以使用underscore.js这样的库:
var selectedUser = _.find( users, function( user ){
return user.id === 70;
} );
...或者你可以在稍微不那么近的forEach
method:
var selectedUser;
users.forEach( function( user ){
if( user.id === 70 ){
selectedUser = user;
}
} );
但是如果你想使用不使用库而支持旧版浏览器的脚本,你需要一个for循环:
var selectedUser;
for( var i = 0; i < users.length; i++ ){
if( users[ i ].id === 70 ){
selectedUser = users[ i ];
break;
}
};
答案 2 :(得分:3)
看一下Underscore.js来轻视这个,就像这样:
_.findWhere(users, { id: 68 })
当然,你可以传入一个变量来匹配:
_.findWhere(users, { id: selectedGroup.owner })
答案 3 :(得分:1)
您可以循环遍历数组以匹配:
var match = function (array, matchfn) {
var i;
for (i in array) {
if (matchfn(array[i])) {
return array[i];
}
}
};
var user = match(users, function (u) { return u.id == 70; });
答案 4 :(得分:1)
如果你必须使用现有的javascript对象,我认为蛮力解决方案是唯一的选择:
var owner;
for(var i = 0; i < users.length; i++) {
if (users[i].id == selectedGroup.id) {
owner = users[i];
break;
}
}
if (owner) {
console.log(owner);
}
根据您的使用方式,重构第一个对象以便直接访问属性可能更有效:
var users = {
"68": {
id: 68,
name: 'mike',
domain: 'i: 0#.f | admembers | mike.ca',
email: 'mike.ca',
isAdmin: false
}
};
var selectedGroup = {
name: 'Students',
id: 78,
description: '',
owner: 68,
ownerIsUser: 'True'
};
var owner = users[selectedGroup.owner];
答案 5 :(得分:0)
您还可以使用Array.prototype.some来比较所有对象属性,以查看它们是否包含相等的值。
function haveSameValues(oneObject, anotherObject) {
var hasDifferentKeyValues = Object.keys(oneObject).some(function(key){
return oneObject[key] !== anotherObject[key]
});
return !hasDifferentKeyValues;
}