11
votes

Comparer deux tableaux contenant des objets

J'ai deux tableaux qui ne contiennent que des objets pour des groupes. On contient tous les groupes sur mon site. L'autre contient tous les groupes qu'un utilisateur spécifique appartient à.

Je voudrais soustraire: Tous les groupes CODE> - Groupes d'utilisateurs CODE> = Les groupes restants CODE> P>

Je suis Utiliser Angularjs, je ne suis pas sûr que cela aide ici ou non (peut-être qu'un filtre pourrait être utilisé). p>

J'ai regardé les questions précédentes et je suis tombé sur certaines options: p>

Ce sont ceux que j'ai essayés: p> xxx pré>

ceci est un des tableaux: p>

Scandedgroups: P>

[{
    id: 115,
    name: 'Test Group 2',
    Description: '',
    owner: 10,
    OwnerIsUser: false,
}, {
    id: 116,
    name: 'Test Group 3',
    Description: '',
    owner: 71,
    OwnerIsUser: false,
}, {
    id: 117,
    name: 'Test Group 4',
    Description: '',
    owner: 71,
    OwnerIsUser: false,
}, {
    id: 118,
    name: 'Test Group 5',
    Description: '',
    owner: 115,
    OwnerIsUser: false,
}, {
    id: 119,
    name: 'Test Group 6',
    Description: '',
    owner: 8,
    OwnerIsUser: true,
}];


0 commentaires

4 Réponses :


0
votes

Vous pouvez essayer ce xxx

résultat xxx

json diff xxx


1 commentaires

Je ne comprends pas. J'essaie d'obtenir un troisième matrice qui est la différence entre 2 graphiques d'objets. Cette solution comparaisse simplement deux tableaux.



-3
votes

(Peut-être qu'un filtre pourrait être utilisé).

Si vous souhaitez filtrer tous les groupes inutilisés, un filtre est la bonne décision: xxx

voici le violon .

pour la documentation prennent un poloog à MDN arra.pototype.filter

pour une solution future avec ou FINDIDEX Jetez un coup d'œil à Ceci Article fin.

Edit: Pour traiter avec Objets Vous pouvez facilement adapter la fonction de filtrage et utiliser une fonction de comparaison personnalisée à la place indexof . Voici un autre Fiddle pour ce cas.


3 commentaires

J'ai ajouté un violon pour cette affaire.


Vous répondez est le seul qui fonctionne réellement. Je passe juste du mal à comprendre. Je vais jeter un coup d'œil à la documentation demain, cela pourrait aider. Merci.


J'ai essayé votre solution mais j'ai édité les groupes pour refléter la manière dont mes données sont modélisées. Cela ne fonctionne pas malheureusement. jsfiddle.net/udaug/6



8
votes

Je pense que vous devriez d'abord extraire des identifiants vers un objet, puis comparez deux objets. EG:

var assignedGroupsIds = {};
var groupsIds = {};
var result = [];

$scope.assignedGroups.forEach(function (el, i) {
  assignedGroupsIds[el.id] = $scope.assignedGroups[i];
});

$scope.groups.forEach(function (el, i) {
  groupsIds[el.id] = $scope.groups[i];
});

for (var i in groupsIds) {
    if (!assignedGroupsIds.hasOwnProperty(i)) {
        result.push(groupsIds[i]);
    }
}

return result;


2 commentaires

Hé, je travaille toujours sur ça. Je pense que je suis en train de courir dans un problème de synchronisation: j'ai téléchargé mon service et ajouté des notes: jsfiddle.net / 9DZ5A / 1


Je pense que votre commentaire est un problème complètement différent. Je n'ai aucune idée de ce que sont les spservices et à quel point pourrais-je passer ou déboguer cela. Mais je suis sûr que les groupes d'affectation de votre code sont indéfinis. Peut-être que c'est une question de scoper?



2
votes

Vous pouvez utiliser une combinaison de filtre angulaire JS $ filtre CODE> SERVICE et LO-DAST'S FINDOWERWELS code> pour obtenir des objets uniques dans deux tableaux, essayez ceci:

  groupsRemaining =  $filter('filter')(allTheGroups, function(allTheGroupsObj){
                      return !angular.equals(allTheGroupsObj, $filter('filter')(userGroups, function(userGroupsObj){
                      return angular.equals(allTheGroupsObj,userGroupsObj);})[0]);
                  });


0 commentaires