Может _lodash проверить массив, чтобы проверить, имеет ли элемент массива поле с определенным значением?
У меня есть переменная selectedSubTopicId
, и у меня есть массив объектов subTopic: objectiveDetail.subTopics[]
. Каждый subTopic
объект имеет поле subTopicId
Я хотел бы использовать его для включения или отключения и добавления темы. Могу ли я использовать lodash в ng-disabled для проверки этого массива и сообщить об этом, если какой-либо элемент объекта subTopic
в массиве имеет subTopicId
, равный selectedSubTopicId
.
Вот пример данных, которые в объектеDetail. В этом случае только один элемент в массиве subTopics.
{"objectiveDetailId":285,
"objectiveId":29,
"number":1,
"text":"x",
"subTopics":[{"subTopicId":1,
"number":1}]
}
Вот код в моем контроллере 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>
Проблема в том, что он не совсем работает, и кнопка не отображается отключена.
Ответы
Ответ 1
Вы не просили, как это сделать, но я предполагаю, что вы хотели знать.
Как я уже упоминал, вы можете использовать _.some
, который будет перебирать каждый элемент в массиве и выполнять обратный вызов. В этом обратном вызове вы можете проверить, равно ли значение свойства topic значение переменной:
var result = _.some(objectiveDetail.subTopics, function (topic) {
return topic.subTopicId === selectedSubTopicId;
});
_.some
пропустит оставшиеся элементы, если он найдет тот, для которого возвращался обратный вызов true
.
Ответ 2
Существует также немного более элегантная форма:
var result = _.some(objectiveDetail.subTopics, {subTopicId: selectedSubTopicId});
Ответ 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
в любом из указанных вами столбцов.