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

时间:2014-01-29 16:40:28

标签: 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
 } 

6 个答案:

答案 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;
}