2014-01-22 2 views
24

У меня есть переменная selectedSubTopicId, и у меня есть массив объектов subTopic: objectiveDetail.subTopics[]. Каждый subTopicобъект имеет полеsubTopicIdМожет ли _lodash проверить массив, чтобы проверить, имеет ли элемент массива поле с определенным значением?

Я хотел бы использовать эту функцию, чтобы включить или отключить и кнопку Добавить тему. Могу ли я использовать lodash в ng-disabled для проверки этого массива и сообщить об истинности, если какой-либо объект объекта subTopic имеет массив subTopicId, который равен selectedSubTopicId.

Вот пример данных, которые находятся в объектеDetail. В этом случае в массиве subTopics есть только один элемент.

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

Вот код в моем угловом контроллере предложил 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> 

Проблема заключается в том, что это не совсем работает, и кнопка не отображается отключена.

+1

Да, вы можете (подсказка: http://lodash.com/docs#some). –

ответ

43

Вы не просили о том, как это сделать, но я предполагаю, что это то, что вы хотели знать ,

Как я уже говорил, вы можете использовать _.some, который будет перебирать все элементы массива и выполнять обратный вызов. В этой функции обратного вызова вы можете проверить, равно ли значение свойства этой темы значения переменного:

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

_.some пропустит оставшиеся элементы, если он нашел тот, для которой обратного вызова, возвращенного true.

+0

Спасибо! Это должно быть псевдонимом для '_.includes' или' _.exists'. –

2

Вы можете использовать _.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 
16

Существует также немного более элегантный вид:

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

Если значение не вложенно, вы не можете использовать сокращенную форму. _.some (['a', 'b', 'c'], _.partial (_. Eq, 'd')) –

0

Это один работал на меня очень хорошо: он помогает, когда у вас есть много столбцов данных для проверки против, скажем, название, категорию и описание.

Чтобы проверить stringTosearch можно найти в любом из этих столбцов данных, вы можете сделать:

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

Она возвращает любой объект вашего массива, который имеет stringTosearch в любом из столбцов, указанных.

Смежные вопросы