Как получить indexOf объекта в коллекции объектов ответа AngularJS?
Пример использования
У меня есть коллекция объектов, возвращаемых из запроса REST. Angular автоматически заполняет каждый элемент с помощью $$hashKey
. Проблема в том, что когда я ищу объект в этом массиве без $$hashKey
, он возвращает -1. Это имеет смысл. К сожалению, я не знаю значения $$hashKey
.
Вопрос
Существует ли более эффективный способ поиска объекта в коллекции объектов, возвращаемого запросом REST в AngularJS, без выделения свойства $$hashKey
?
код
function arrayObjectIndexOf(arr, obj) {
var regex = /,?"\$\$hashKey":".*?",?/;
var search = JSON.stringify(obj).replace(regex, '');
console.log(search);
for ( var i = 0, k = arr.length; i < k; i++ ){
if (JSON.stringify(arr[i]).replace(regex, '') == search) {
return i;
}
};
return -1;
};
Ответы
Ответ 1
angular.equals()
выполняет глубокое сравнение объектов без префиксов $
...
function arrayObjectIndexOf(arr, obj){
for(var i = 0; i < arr.length; i++){
if(angular.equals(arr[i], obj)){
return i;
}
};
return -1;
}
Ответ 2
Так как это angular, почему бы не использовать фильтрацию:
$filter ('filter') (страницы, {id: pageId}, true);
где страницы - это массив, а id - свойство объекта, которое вы хотите сопоставить, и pageId - это значение, которое вы соответствуете.
Ответ 3
Хорошо, так что это немного уродливо, но это самое простое решение:
function arrayObjectIndexOf(arr, obj) {
JSON.parse(angular.toJson(arr)).indexOf(obj)
}
Бит angular.toJson
удаляет любые атрибуты с ведущим значением $. Вы можете просто захотеть сохранить этот чистый объект где-то для поиска. Кроме того, вы можете написать свой собственный материал сравнения, но это просто bleh.
Ответ 4
Использовать lodash find, где, фильтр для управления коллекциями, проверить документы http://lodash.com/docs