循环遍历对象数组以查找具有匹配属性的对象

Bat*_*man 11 javascript arrays loops

我有一个数组,一个包含所有具有唯一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
 } 
Run Code Online (Sandbox Code Playgroud)

Ell*_*lle 20

你必须循环users:

var i = users.length,
    ownerData;

while(i--) {
    if(selectedGroup.owner == users[i].id) {
        ownerData = users[i];
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

或者您可以使用Array.filter():

var ownerData = users.filter(function(user) {
    return user.id === selectedGroup.owner;
})[0];
Run Code Online (Sandbox Code Playgroud)

  • 我理解索引部分,而不是ownerData部分.不应该像var i = x.length一样单独声明; var ownerData; (2认同)

Bar*_*ney 7

在ECMAScript 6中,您可以使用本机Array.find方法:

var selectedUser = users.find( function( user ){
  return user.id === 70;
} );
Run Code Online (Sandbox Code Playgroud)

看到目前只有最新的Firefox支持这一点,你可以使用像underscore.js这样的库:

var selectedUser = _.find( users, function( user ){
  return user.id === 70;
} );
Run Code Online (Sandbox Code Playgroud)

...或者您可以使用稍微不那么近的forEach方法的包装器:

var selectedUser;

users.forEach( function( user ){
  if( user.id === 70 ){
    selectedUser = user;
  }
} );
Run Code Online (Sandbox Code Playgroud)

但是如果你想使用不使用库而支持旧浏览器的脚本,你需要一个for循环:

var selectedUser;

for( var i = 0; i < users.length; i++ ){
  if( users[ i ].id === 70 ){
    selectedUser = users[ i ];

    break;
  }
};
Run Code Online (Sandbox Code Playgroud)