2014-01-22 9 views
24

Ich habe eine Variable selectedSubTopicId und ich habe ein Array von subTopic-Objekten: objectiveDetail.subTopics[]. Jedes subTopicObjekt hat ein FeldsubTopicIdKann _lodash ein Array testen, um zu prüfen, ob ein Array-Element ein Feld mit einem bestimmten Wert hat?

Ich mag würde dies verwenden, um zu aktivieren oder deaktivieren und Thema-Taste hinzufügen. Kann ich lodash in ng-disabled verwenden, um dieses Array zu testen und true zu melden, wenn ein subTopic Objektelement des Arrays eine subTopicId hat, die gleich selectedSubTopicId ist.

Hier ist ein Beispiel für die Daten in objectiveDetail. In diesem Fall gibt es nur ein Element im subTopics-Array.

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

Hier ist der Code in meinen Angular-Controller von thefourtheye vorgeschlagen:

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

Meine Schaltfläche mit der Klick-Funktion wie diese nicht gezeigt aussieht:

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

Das Problem ist, dass es funktioniert nicht ganz und die Schaltfläche wird nicht deaktiviert angezeigt.

+1

Ja, Sie können (Hinweis: http://lodash.com/docs#some). –

Antwort

43

Sie nicht gebeten haben, wie es geht, aber ich nehme an das ist, was Sie wissen wollten .

Wie bereits erwähnt, können Sie _.some verwenden, die über jedes Element im Array iterieren und einen Rückruf ausführen. In diesem Rückruf können Sie testen, ob der Wert des Vermögens des Themas den Wert der Variablen gleich:

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

_.some werden die übrigen Elemente überspringen, wenn es eine, für die gefunden der Rückruf true zurückgegeben.

+0

Danke! Dies sollte Alias ​​für "_.includes" oder "_.exists" sein. –

2

Sie _.some Methode verwenden können, wie diese

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"); 
} 

Ausgabe

selectedSubTopicId exists 
16

Es ist auch ein bisschen eleganter Form:

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

Wenn der Wert nicht verschachtelt ist, können Sie keine Kurzschrift verwenden. _.some (['a', 'b', 'c'], _.partial (_. Eq, 'd')) –

0

Dieses ist für mich sehr gut funktioniert: Es hilft, wo Du viele Datenspalten haben gegen zu überprüfen, sagen Sie Titel, Kategorie und Beschreibung.

Um zu überprüfen, ob stringTosearch in einer dieser Spalten von Daten gefunden, die Sie tun können:

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

Es wird ein beliebiges Objekt Ihrer Array zurück, die stringTosearch in einer der Spalten von Ihnen angegebenen hat.

Verwandte Themen