2013-10-21 20 views
29

Underscore.js dosyasını kullanarak nesne aramasında arama yapmaya çalışıyorum, ancak istediğimi hedefleyemiyorum.Belirli bir değeri içeren diziden bir nesne alın

console.log(_.findWhere(response.data, { TaskCategory: { TaskCategoryId: $routeParams.TaskCategory } })); 

Ancak bu undefined $routeParams.TaskCategory dönen Bu, arama am dizi içinde nesneler bir örneğidir 301

eşittir. Bu veriler Ben TaskCategory.TaskCategoryId kullanarak o dizide ikinci nesneyi istediğiniz Yani

[{ 
    "TaskCategory": { 
     "TaskCategoryId": 201, 
     "TaskName": "TaskName" 
    }, 
    "TaskCount": 1, 
    "Tasks": [{ 
     "EventTypeId": 201, 
     "EventName": "Event Driver", 
     "EventDate": "0001-01-01T00:00:00", 
     "EventId": "00000000-0000-0000-0000-000000000000", 
    }] 
}, 
{ 
    "TaskCategory": { 
     "TaskCategoryId": 301, 
     "TaskName": "TaskName" 
    }, 
    "TaskCount": 1, 
    "Tasks": [{ 
     "EventTypeId": 201, 
     "EventName": "Event Driver", 
     "EventDate": "0001-01-01T00:00:00", 
     "EventId": "00000000-0000-0000-0000-000000000000", 
    }] 
}] 

data.response ile temsil edilir, bunun çizgi kullanılarak elde etmek mümkündür? yerine findWhere ait

cevap

49

Kullanım _.find:

console.log(_.find(response.data, function(item) { 
    return item.TaskCategory.TaskCategoryId == $routeParams.TaskCategory; 
})); 
Birbirlerine benzerler

ancak findWhere (o iç içe nesneleri içerir gibi senaryoda kullanışlı değil) anahtar-değer çiftleri eşleştirmek istediğiniz özel durumlar için tasarlanmıştır. Find, daha genel kullanım içindir, çünkü bu, yüklem olarak bir işlev sağlamanıza olanak tanır. Gördüğünüz gibi

_.where = function(obj, attrs, first) { 
    if (_.isEmpty(attrs)) return first ? void 0 : []; 
    return _[first ? 'find' : 'filter'](obj, function(value) { 
    for (var key in attrs) { 
     if (attrs[key] !== value[key]) return false; 
    } 
    return true; 
    }); 
}; 

_.findWhere = function(obj, attrs) { 
    return _.where(obj, attrs, true); 
}; 

şöyle

+0

kullanmak için bir yedek olurdu filtre kullanarak Bu durumda '_.''. _.filter' yerine '_.find' kullanmalıdır. – forivall

+0

@forivall oh, elbette ... teşekkürler. Filtre, tüm koleksiyonu arar, oysa ilk karşılaşmada durakları bulur. Güncelledik. – McGarnagle

+0

Teşekkürler, '_.find' mükemmel çalıştı. Bu kütüphaneye oturmam ve hafta sonu öğrenmem gerek. – Neil

6

_.findWhere/_.where kaynağı derin eşitlik yerine katı eşitlik gerçekleştirir olduğunu. Eğer derin arama istiyorsanız nerede, bu (denenmemiş, optimize edilmemiş) yeterli olacaktır:

_.whereDeep = function(obj, attrs, first) { 
    if (_.isEmpty(attrs)) return first ? void 0 : []; 
    return _[first ? 'find' : 'filter'](obj, function(value) { 
    for (var key in attrs) { 
     if (attrs[key] !== value[key] || !(_.isObject(attrs[key]) && _.whereDeep([value[key]], attrs[key], true))) return false; 
    } 
    return true; 
    }); 
}; 

_.findWhereDeep = function(obj, attrs) { 
    return _.whereDeep(obj, attrs, true); 
}; 

Ve neredeyse değişmeden, kodunuzu kullanmak mümkün olacaktır

_.findWhereDeep(response.data, { TaskCategory: { TaskCategoryId: $routeParams.TaskCategory } }); 
İlgili konular