Как получить 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