Jquery, как найти объект по атрибуту в массиве - PullRequest
62 голосов
/ 07 апреля 2011

Учитывая, что у меня есть массив "целевых" объектов:

//array of purpose objects:
var purposeObjects = [
    {purpose: "daily"},
    {purpose: "weekly"},
    {purpose: "monthly"}
];

(для простоты я опускаю другие атрибуты)

Теперь я хочу иметь метод, который возвращает конкретныйобъектов, если найдено подходящее имя цели.

Это не работает:

function findPurpose(purposeName){
    return $.grep(purposeObjects, function(){
      return this.purpose == purposeName;
    });
};

findPurpose("daily");

, но фактически возвращает пустой массив:

[]

Я использую JQuery 1.5.2.Я также пытался с $ .each (), но безуспешно.По-видимому, большинство методов JQuery предназначены для использования с элементами DOM (например, filter().

. Есть идеи, как этого добиться?

Ответы [ 11 ]

0 голосов
/ 07 августа 2016

Я создал сервис утилит для моего углового приложения. У него есть две функции, которые используют очень часто.

Например, у вас есть объект.

Первое рекурсивное получение значения из объекта без выдачи неопределенной ошибки.

{prop: {nestedProp1: {nestedProp2: somevalue}}}; получить nestedProp2 2 без неопределенных проверок.

Второй массив фильтров на основе

[{prop: {nestedProp1: {nestedProp2: somevalue1}}}, {prop: {nestedProp1: {nestedProp2: somevalue2}}}];

Найти объект из массива с помощью nestedProp2 = somevalue2

app.service('UtilService', function(httpService) {
this.mapStringKeyVal = function(map, field) {
    var lastIdentifiedVal = null;
    var parentVal = map;
    field.split('.').forEach(function(val){
        if(parentVal[val]){
            lastIdentifiedVal = parentVal[val]; 
            parentVal = parentVal[val]; 
        }
    });
    return lastIdentifiedVal;
}


this.arrayPropFilter = function(array, field,value) {
    var lastIdentifiedVal = null;
    var mapStringKeyVal = this.mapStringKeyVal;
    array.forEach(function(arrayItem){
        var valueFound = mapStringKeyVal(arrayItem,field);
        if(!lastIdentifiedVal  && valueFound && valueFound==value){
            lastIdentifiedVal = arrayItem;
        }
    });
    return lastIdentifiedVal;
}});

Для решения текущего вопроса. введите UtilService и позвоните,

UtilService.arrayPropFilter(purposeArray,'purpose','daily');

Или более продвинутый

UtilService.arrayPropFilter(purposeArray,'purpose.nestedProp1.nestedProp2','daily');
...