【问题标题】:Can _lodash test an array to check if an array element has a field with a certain value?_lodash 可以测试数组以检查数组元素是否具有具有特定值的字段吗?
【发布时间】:2014-01-22 09:17:05
【问题描述】:

我有一个变量selectedSubTopicId,我有一个子主题对象数组:objectiveDetail.subTopics[]。每个subTopic object 都有一个字段 subTopicId

我想用它来启用或禁用和添加主题按钮。如果数组的任何subTopic 对象元素的subTopicId 等于selectedSubTopicId,我可以在ng-disabled 中使用lodash 来测试这个数组并报告true。

以下是 objectiveDetail 中的数据示例。在这种情况下,subTopics 数组中只有一个元素。

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

这是 thefourtheye 建议的我的 Angular 控制器中的代码:

    $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>

问题是它不能很好地工作并且按钮没有显示为禁用。

【问题讨论】:

标签: javascript lodash


【解决方案1】:

你没有问怎么做,但我想这就是你想知道的。

正如我已经提到的,您可以使用_.some,它将遍历数组中的每个元素并执行回调。在该回调中,您可以测试主题​​属性的值是否等于变量的值:

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

如果_.some 找到回调返回true 的元素,它将跳过其余元素。

【讨论】:

  • 谢谢!这应该别名为_.includes_.exists
【解决方案2】:

还有更优雅一点的形式:

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

【讨论】:

  • 如果值不是嵌套的,你不能使用速记。 .some(['a','b','c'], _.partial(.eq, 'd'))
【解决方案3】:

你可以使用_.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

【讨论】:

    【解决方案4】:

    这对我很有效:它可以帮助您检查多列数据,例如标题、类别和描述。

    要检查是否在任何这些数据列中找到stringTosearch,您可以执行以下操作:

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

    它将返回数组中在您指定的任何列中具有stringTosearch 的任何对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-05
      • 2020-07-05
      • 2017-10-29
      • 1970-01-01
      • 2016-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多