web-dev-qa-db-fra.com

Boucle dans un tableau d'objets pour trouver un objet avec une propriété correspondante

J'ai 1 tableau, un avec une liste de tous mes utilisateurs avec des identifiants uniques. J'ai un objet qui contient contient une information sur les groupes sélectionnés. Une partie de cette information est l'identifiant du propriétaire. J'essaie de comprendre comment obtenir les informations des utilisateurs en fonction de l'ID de propriétaire du groupe. Par exemple, l'objet de groupe d'étudiants a un ID de propriétaire de 70, il y a un utilisateur sur mes sites qui a un ID de 70 ... comment puis-je les faire correspondre?

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
 } 
10
Batman

Vous devrez parcourir users:

var i = users.length,
    ownerData;

while(i--) {
    if(selectedGroup.owner == users[i].id) {
        ownerData = users[i];
        break;
    }
}

Ou vous pouvez utiliser Array.filter() :

var ownerData = users.filter(function(user) {
    return user.id === selectedGroup.owner;
})[0];
20
Elliot Bonneville

Dans ECMAScript 6, vous pouvez utiliser la méthode native Array.find :

var selectedUser = users.find( function( user ){
  return user.id === 70;
} );

Vu que seul le dernier Firefox supporte cela pour le moment, vous pouvez utiliser une bibliothèque comme underscore.js :

var selectedUser = _.find( users, function( user ){
  return user.id === 70;
} );

… Ou vous pouvez utiliser un wrapper autour de la méthode légèrement moins récente forEach :

var selectedUser;

users.forEach( function( user ){
  if( user.id === 70 ){
    selectedUser = user;
  }
} );

Mais si vous souhaitez utiliser un script prenant en charge les navigateurs hérités sans utiliser de bibliothèques, vous aurez besoin d'une boucle for:

var selectedUser;

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

    break;
  }
};
7
Barney

Regardez Underscore.js pour banaliser cela, comme ceci:

_.findWhere(users, { id: 68 })

Naturellement, vous pouvez passer une variable pour correspondre à:

_.findWhere(users, { id: selectedGroup.owner })
3
swornabsent

Si vous devez travailler avec des objets javascript existants, je pense qu'une solution en force brute est la seule option:

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

Selon l'utilisation que vous en faites, il peut s'avérer plus efficace de restructurer votre premier objet afin de pouvoir accéder directement à une propriété:

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];
1
Jason P

Vous pouvez simplement faire une boucle sur le tableau pour correspondre à cela:

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

Vous pouvez également utiliser Array.prototype.some pour comparer toutes les propriétés des objets afin de déterminer si elles contiennent des valeurs égales.

function haveSameValues(oneObject, anotherObject) {
  var hasDifferentKeyValues = Object.keys(oneObject).some(function(key){ 
    return oneObject[key] !== anotherObject[key]
  });

  return !hasDifferentKeyValues;
}
0
Mike T