2 votes

Recherche d'un tableau JSON à partir d'un autre tableau JSON node js

J'essaie de filtrer un tableau JSON en utilisant les critères d'un autre tableau JSON que j'ai utilisé (filter).

Voici mon code :

function filterArray(object, criteria){
    return object.filter(function(obj){
        for(var i=0;i<criteria.length;i++){
            let criteriaEle = criteria[i];
            return Object.keys(criteriaEle).forEach(function(key){
                if(obj[key] == criteriaEle[key]){
                    return obj;
                }
            })
        }
    })
}

Par exemple :

object = [{type:1,company:1,color:0,name:a},{type:2,company:1,color:0,name:b},{type:1,company:3,color:0,name:c},{type:4,company:1,color:0,name:d},{type:1,company:1,color:1,name:e}]

criteria = [{type:1,company:1,color:0},{type:1,company:1,color:1}]

Donc, si je donne ces deux tableaux à la fonction, elle doit renvoyer

obj = [{{type:1,company:1,color:0,name:a},{type:1,company:1,color:1,name:e}}]

Je ne sais pas trop où je me trompe. Merci de m'aider.

Mise à jour : Je ne veux pas non plus utiliser obj.type ou obj.company ou object.color comme paramètres de recherche car je veux que mon code soit facile à maintenir et je ne veux pas avoir à le mettre à jour plus tard si d'autres critères sont ajoutés.

3voto

user2731189 Points 13
const data = [{type:1,company:1,color:0,name:'a'},{type:2,company:1,color:0,name:'b'},{type:1,company:3,color:0,name:'c'},{type:4,company:1,color:0,name:'d'},{type:1,company:1,color:1,name:'e'}];

const criteria = [{type:1,company:1,color:0},{type:1,company:1,color:1}];

function checkCriteria(obj) {
  return criteria.some(criterion => {
    for (const key in criterion) {
      if (criterion[key] !== obj[key]) {
        return false;
      }
    }
    return true;
  });
}

const filtered = data.filter(checkCriteria);

console.log('Filtered array: ', filtered);

Voici une solution.

Voici quelques références

Tableau.some Filtre.tableau

Sur la base du commentaire, ajout d'un autre extrait pour expliquer le concept des fermetures.

const data = [{type:1,company:1,color:0,name:'a'},{type:2,company:1,color:0,name:'b'},{type:1,company:3,color:0,name:'c'},{type:4,company:1,color:0,name:'d'},{type:1,company:1,color:1,name:'e'}];

function createCriteriaValidationFunction(criteria) {
  return function checkCriteria(obj) {
    return criteria.some(criterion => {
      for (const key in criterion) {
        if (criterion[key] !== obj[key]) {
          return false;
        }
      }
      return true;
    });
  }
}

const criteria = [{type:1,company:1,color:0},{type:1,company:1,color:1}];

const filtered = data.filter(createCriteriaValidationFunction(criteria));

console.log('Filtered array: ', filtered);

Il s'agit du même concept que précédemment, mais les critères ont été définis dans le dossier. Cette fois, les critères peuvent être définis à l'extérieur et peuvent être transmis à la fonction. L'astuce consiste à créer la fonction checkCriteria à la volée avec les critères passés et disponibles dans la fermeture. Dans les deux cas, la variable criteria est disponible dans la portée dans laquelle checkCriteria est exécutée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X