2015-06-14 6 views
1

У меня есть документ MongoDB с массивом объектов поля вида:Выполняет ли _.pluck исходный индекс массива «выщипывания»?

"leaving_users" : [ 
     { 
      "user_id" : "FZ78Pr82JPz66Gc3p", 
      "leaving_date" : ISODate("2015-06-12T14:14:14.501Z") 
     } 
    ] 

Могу ли я использовать _.pluck для получения leaving_date относящихся к определенному user_id?

Мой код, кажется, работает нормально, но я хотел проверить, что это правильный способ сделать это, и быть уверенным, что иногда я не буду заканчивать другим индексом, если я использую функцию _.pluck.

Вот мой код:

if (doc.leaving_users //guarding 
    //if the user belongs to the leaving_users object array 
    && _.pluck(doc.leaving_users, "user_id").indexOf(userId) != -1 
    //if his leaving_date field is after yesterday 
    && doc.leaving_users[_.pluck(doc.leaving_users, "user_id").indexOf(userId)].leaving_date > yesterday) 
       { 
        leftRecently = true; 
       } else{ 
        leftRecently = false; 
       } 

Бонус вопрос: как бы вы сделать это более изящным?

ответ

2

Да, индексы будут одинаковыми. Это понятно, если посмотреть на the implementation of _.pluck:

_.pluck = function(obj, key) { 
    return _.map(obj, _.property(key)); 
}; 

... и the implementation of _.map:

_.map = _.collect = function(obj, iteratee, context) { 
    iteratee = cb(iteratee, context); 
    var keys = !isArrayLike(obj) && _.keys(obj), 
     length = (keys || obj).length, 
     results = Array(length); 
    for (var index = 0; index < length; index++) { 
    var currentKey = keys ? keys[index] : index; 
    results[index] = iteratee(obj[currentKey], currentKey, obj); 
    } 
    return results; 
}; 

То есть, я не назвал бы _.pluck в два раза, как это, и я не думаю, что я хотел бы использовать _.pluck для этого вообще, я бы использовал _.findIndex и сохранить результат:

var index; 
if (doc.leaving_users //guarding 
    //if the user belongs to the leaving_users object array 
    && (index = _.findIndex(doc.leaving_users, function(e) { e.user_id === userId; }) !== -1) 
    //if his leaving_date field is after yesterday 
    && doc.leaving_users[index].leaving_date > yesterday) 
       { 
        leftRecently = true; 
       } else{ 
        leftRecently = false; 
       } 
+0

И как вы думаете, мой подход эффективный/элегантный? Должен ли я выполнять все эти задачи? – Billybobbonnet

+0

@Billybobbonnet: Как ни странно, я просто редактировал что-то об этом. :-) –

+0

Спасибо! Это хороший ответ. Я проверяю его. – Billybobbonnet

Смежные вопросы