2017-08-21 1 views
0

J'essaie de vérifier si une valeur est trouvée à l'intérieur d'un tableau contenu dans un objet sans avoir à utiliser plusieurs pour & pour les boucles in. Je veux savoir s'il existe un moyen élégant d'y parvenir. Ma première pensée a été d'utiliser _.includes de Lodash, mais il ne semble pas itérer sur le tableau dans mon sous-objet.Effectuer une recherche approfondie dans l'objet sans utiliser de boucles imbriquées (lodash)

//collection (i'm trying to reach person_id in the people array) 
var tables = { 
12: { 
    table_info: { 
    name: 'Test' 
    }, 
    people: [ //I want to check inside of this array 
    { 
    person_id: 123 
    }, 
    { 
    person_id: 233 
    } 
    ] 
} 

//what i'm looping over to match up id's 
var people = [ 
{ 
    name: 'John Doe', 
    id: 123 
}, 
{ 
    name: 'Jane Doe', 
    id: 245 
} 
] 

//loop 
for (var i = 0; i < people.length; i++) 
{ 
    if (_.includes(tables, people[i].id)) //would love a simple solution like this 
    { 
    console.log("match"); 
    } 
    else 
    { 
    console.log("no match"); 
    } 
} 
+1

Avez-vous essayé du tout sans utiliser les bibliothèques? Essayez de créer la logique étape par étape. De plus, comment une bibliothèque sait-elle que vous recherchez dans le tableau 'people' pour' person_id's? – clabe45

Répondre

0

pourquoi ne pas créer votre propre fonction et de l'utiliser si vous connaissez la structure de données?

//collection 
 
var tables = { 
 
12: { 
 
    table_info: { 
 
     name: 'Test' 
 
    }, 
 
    people: [ 
 
    { 
 
     person_id: 123 
 
    }, 
 
    { 
 
     person_id: 233 
 
    } 
 
    ] 
 
    } 
 
}; 
 

 
var peopleToFind = [ 
 
{ 
 
    name: 'John Doe', 
 
    id: 123 
 
}, 
 
{ 
 
    name: 'Jane Doe', 
 
    id: 245 
 
} 
 
]; 
 

 
function findPeopleInTables(people, tables){ 
 
    let peopleFound = []; 
 
    for (var key in tables) { 
 
    // to make sure it doesnt come from prototype 
 
    if (tables.hasOwnProperty(key)) { 
 
     tables[key].people.forEach(function (person){ 
 
      peopleToFind.forEach(function(personToFind){ 
 
      if (person.person_id === personToFind.id){ 
 
       peopleFound.push(personToFind); 
 
      } 
 
      }); 
 
     }); 
 
    } 
 
    } 
 
    return peopleFound; 
 
} 
 

 
let foundPeople = findPeopleInTables(peopleToFind, tables); 
 
foundPeople.forEach(function(person){ 
 
    console.log('found "' + person.name + '" with id ' + person.id); 
 
});

vous pouvez également rechercher des objets en utilisant des méthodes récursives:

function findValueInObject(value , object){ 
 
    let type = typeof(object); 
 
    if(type !== 'string' && type !== 'number' && type !== 'boolean'){ 
 
     for (var key in object) { 
 
      // to make sure it doesnt come from prototype 
 
      if (object.hasOwnProperty(key)) { 
 
       if(findValueInObject(value , object[key])){ 
 
        return true; 
 
       } 
 
      } 
 
     } 
 
    } 
 
    if(object === value){ 
 
     return true; 
 
    } 
 
    return false; 
 
} 
 

 

 
//collection 
 
var tables = { 
 
12: { 
 
    table_info: { 
 
     name: 'Test' 
 
    }, 
 
    people: [ 
 
    { 
 
     person_id: 123 
 
    }, 
 
    { 
 
     person_id: 233 
 
    } 
 
    ] 
 
    } 
 
}; 
 

 
var peopleToFind = [ 
 
{ 
 
    name: 'John Doe', 
 
    id: 123 
 
}, 
 
{ 
 
    name: 'Jane Doe', 
 
    id: 245 
 
} 
 
]; 
 

 
peopleToFind.forEach(function(person){ 
 
    if(findValueInObject(person.id, tables)){ 
 
     console.log('matched: ' + person.id + ' '+ person.name); 
 
    } 
 
});