web-dev-qa-db-fra.com

Lodash peut-il tester un tableau pour vérifier si un élément de tableau a un champ avec une certaine valeur?

J'ai une variable selectedSubTopicId et un tableau d'objets subTopic: objectiveDetail.subTopics[]. Chaque subTopic objet a un champ subTopicId

Je voudrais l'utiliser pour activer ou désactiver et le bouton Ajouter un sujet. Puis-je utiliser lodash dans ng-disabled pour tester ce tableau et indiquer la valeur true si l'un des éléments d'objet subTopic du tableau a une subTopicId égale à selectedSubTopicId.

Voici un exemple des données contenues dans objectiveDetail. Dans ce cas, il n'y a qu'un élément dans le tableau subTopics.

{"objectiveDetailId":285,
 "objectiveId":29,
 "number":1,
 "text":"x",
 "subTopics":[{"subTopicId":1,
               "number":1}]
}

Voici le code dans mon contrôleur angulaire suggéré par thefourtheye: 

    $scope.checkDuplicateSubTopicId = function (objectiveDetail, sSubTopic) {
        if (_.some(objectiveDetail.subTopics, function(currentTopic) {
            return _.contains(currentTopic, selectedSubTopicId);
        })) {
            return true;
        } else {
            return false;
        }
    }

Mon bouton avec la fonction de clic non affichée ressemble à ceci:

   <button data-ng-disabled="checkDuplicateSubTopicId(objectiveDetail, subTopicId)">
       Add Topic
   </button>

Le problème est que cela ne fonctionne pas tout à fait et que le bouton n’affiche pas désactivé.

26
Samantha J T Star

Vous n'avez pas demandé comment faire, mais je suppose que c'est ce que vous vouliez savoir.

Comme je l'ai déjà mentionné, vous pouvez utiliser _.some , qui effectuera une itération sur tous les éléments du tableau et exécutera un rappel. Dans ce rappel, vous pouvez tester si la valeur de la propriété du sujet est égale à la valeur de la variable:

var result = _.some(objectiveDetail.subTopics, function (topic) {
  return topic.subTopicId === selectedSubTopicId;
});

_.some ignorera les éléments restants s'il en a trouvé un pour lequel le rappel a retourné true.

46
Felix Kling

Il y a aussi une forme un peu plus élégante:

var result = _.some(objectiveDetail.subTopics, {subTopicId: selectedSubTopicId});
16
Kiril

Vous pouvez utiliser _.some method, comme ceci

var _ = require("lodash");

var objectiveDetail = {"objectiveDetailId":285,
 "objectiveId":29,
 "number":1,
 "text":"x",
 "subTopics":[{"subTopicId":1,
               "number":1}]
};

var selectedSubTopicId = 1;

if (_.some(objectiveDetail.subTopics, function(currentTopic) {
    return currentTopic.subTopicId === selectedSubTopicId;
})) {
    console.log("selectedSubTopicId exists");
}

Sortie

selectedSubTopicId exists
2
thefourtheye

Celui-ci a très bien fonctionné pour moi: cela aide lorsque vous avez plusieurs colonnes de données à vérifier, par exemple le titre, la catégorie et la description.

Pour vérifier si stringTosearch se trouve dans l’une de ces colonnes de données, vous pouvez effectuer les opérations suivantes:

let searchResults = _.filter(yourArrayHere, (item) => {
            return item.title.indexOf(stringTosearch) > -1
                    || item.category.indexOf(stringTosearch) > -1
                    || item.description.indexOf(stringTosearch) > -1;
        });

Il renverra tout objet de votre tableau contenant stringTosearch dans l'une des colonnes spécifiées.

0
Ruto Collins