2009-12-02 8 views
0

Après avoir demandé quelques photos de l'utilisateur, je me retrouve avec un tableau comme celui-ci:doublons repérage des délinquants dans un tableau

[ 
    { label: "portrait", owner: "Jon" }, 
    { label: "house", owner: "Jim" }, 
    { label: "portrait", owner: "Jim" }, 
    { label: "portrait", owner: "Jane" }, 
    { label: "cat", owner: "Jane" } 
] 

J'ai besoin de mettre en évidence les éléments dont label se produit plusieurs fois dans le tableau (ici: « portrait ») .

Idéalement, il y aurait un drapeau (A) pour les articles dont label se produit à nouveau plus tard dans le tableau, et un autre drapeau (B) pour l'événement final (à savoir à la fois de Jon et les portraits de Jim sont marqués A, alors que Jane obtient B).

Toute aide serait grandement appréciée!

+0

Il n'y a qu'un seul événement de Jon ... Pourquoi aurait-il été signalé? Le chat de Janes est la dernière occurrence ... ne serait-ce pas marqué B? –

+0

Désolé, je viens de réaliser la confusion potentielle ici. Le critère pertinent est le 'nom' de l'image, pas le nom du' propriétaire'. Mise à jour, merci. – AnC

Répondre

1

Je ne suis pas sûr de ce que vous essayez de faire, mais peut-être vous avez juste besoin d'agréger les données?

var data = [ 
    { name: "portrait", owner: "Jon" }, 
    { name: "house", owner: "Jim" }, 
    { name: "portrait", owner: "Jim" }, 
    { name: "portrait", owner: "Jane" }, 
    { name: "cat", owner: "Jane" } 
]; 

var byName = {}; 

for (var i = 0, l = data.length; i < l; ++i) { 
    if (!byName[data[i].name]){ 
     byName[data[i].name] = []; 
    } 
    byName[data[i].name].push(data[i].owner); 
} 

// byName == {portrait: ["Jon", "Jim", "Jane"], house: ["Jim"], cat: ["Jane"]} 

var byOwner = {}; 

for (var i = 0, l = data.length; i < l; ++i) { 
    if (!byOwner[data[i].owner]) { 
     byOwner[data[i].owner] = []; 
    } 
    byOwner[data[i].owner].push(data[i].name); 
} 

Ou peut-être vous aime mieux:

var data = [ 
    { name: "portrait", owner: "Jon" }, 
    { name: "house", owner: "Jim" }, 
    { name: "portrait", owner: "Jim" }, 
    { name: "portrait", owner: "Jane" }, 
    { name: "cat", owner: "Jane" } 
]; 

var byName = []; 

for (var i = 0, l = data.length; i < l; ++i) { 
    var done = false; 
    for (var j = 0, k = data.length; j < k; ++j) { 
     if (byName[j] && byName[j].name == data[i].name) { 
      byName[j].data.push(data[i].owner); 
      done = true; 
     } 
    } 
    if (!done) { 
     byName.push({name: data[i].name, data: [data[i].owner]}); 
    } 
} 

/* 
byName == [ 
    {name: "portrait", data: ["Jon", "Jim", "Jane"]}, 
    {name: "house", data: ["Jim"]}, 
    {name: "cat", data: ["Jane"]} 
] */ 

Parce que l'affichage du code aléatoire est amusant et vous le savez!

+0

Merci - je me suis retrouvé avec quelque chose de très similaire à cela; indexer par nom ('results [image.name] .push (owner)'). Ensuite, je l'aplatis plus tard, ce qui est quand j'ajoute les drapeaux requis. – AnC

+0

Bon à savoir que cela a fonctionné pour vous :) J'ai proposé cela parce qu'il me semblait étrange de marquer les membres d'un tableau plutôt que de simplement les réorganiser. Je suis curieux, pourriez-vous me dire pourquoi vous devez les signaler? Si ce n'est pas un algorithme de supersecret bien sûr :) –

+0

Il se résume essentiellement au nom/label étant l'identifiant unique (pensez à créer un fichier ZIP avec toutes les images, en utilisant label comme nom de fichier) - donc si vous avez plusieurs occurrences, de tels conflits être mis en évidence. – AnC

1

Je suggérerais boucler à travers le tableau d'image et ajouter un membre marqué à chaque objet, selon qu'il est en double. Voir ci-dessous pour un exemple. Il va attribuer n'importe quoi avec un doublon avec un 'A' et le dernier doublon avec un 'B'. Tout ce qui n'est pas un doublon n'est pas marqué.

var picture_array = [ 
     {label: 'portrait', owner: "Jon"}, 
     {label: 'house', owner: "Jim"}, 
     {label: 'portrait', owner: "Jim"}, 
     {label: 'portrait', owner: "Jane"}, 
     {label: 'cat', owner: "Jane"} 
    ], 
    length = picture_array.length; 

//Loop through picture_array 

for(var i = 0; i < length; i++) { 
    var picture = picture_array[i], 
     label = picture.label; 

    //If picture has already been flagged, go the the next picture 
    if (picture.flagged) { 
     continue; 
    } 

    //Loop through rest of the array to compare duplicate labels 
    var picture_a = picture; 
    for(var j = i + 1; j < length; j++) { 
     var picture_b = picture_array[j]; 

     //If picture_a matches picture_b then flag both of them appropriately 
     if (picture_a.label == picture_b.label) { 
      picture_a.flagged = 'A'; 
      picture_b.flagged = 'B'; 
      picture_a = picture_b; 
     } 
    } 
} 
+0

Ceci est assez proche de ce que j'avais en tête à l'origine - mais je suis allé avec la solution de Kaze (pour l'instant?). Merci! – AnC

Questions connexes