web-dev-qa-db-ja.com

_lodashは配列をテストして、配列要素に特定の値のフィールドがあるかどうかを確認できますか?

変数selectedSubTopicIdとsubTopicオブジェクトの配列があります:objectiveDetail.subTopics[]。各subTopicobjectにはfieldsubTopicIdがあります

これを使用して、トピックボタンを有効または無効にし、追加します。 ng-disabledでlodashを使用してこの配列をテストし、配列のsubTopicオブジェクト要素にsubTopicIdと等しいselectedSubTopicIdがある場合にtrueを報告できますか。

次に、objectiveDetailにあるデータのサンプルを示します。この場合、subTopics配列には要素が1つしかありません。

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

以下は、my Angular thefourtheyeによって提案されたコントローラーのコードです。

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

クリック機能が表示されていない私のボタンは次のようになります。

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

問題は、それがまったく機能せず、ボタンが無効になっていないことです。

27

あなたはそれを行う方法を尋ねませんでしたが、私はそれがあなたが知りたかったことだと思います。

すでに述べたように、 _.some 。配列内のすべての要素を反復処理し、コールバックを実行します。そのコールバックでは、トピックのプロパティの値が変数の値と等しいかどうかをテストできます。

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

_.someは、コールバックがtrueを返した要素が見つかった場合、残りの要素をスキップします。

46
Felix Kling

もう少しエレガントな形式もあります。

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

_.some メソッド、このような

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

出力

selectedSubTopicId exists
2
thefourtheye

これは非常にうまく機能しました。タイトル、カテゴリ、説明など、チェックするデータの列が多数ある場合に役立ちます。

これらのデータ列のいずれかにstringTosearchが見つかったかどうかを確認するには、次のようにします。

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

指定した列のいずれかにstringTosearchがある配列のオブジェクトを返します。

0
Ruto Collins