2015-02-17 3 views
2

У меня есть следующий код JavascriptПодчеркивание фильтр, индекс доступа

log = _.filter(r.logs, (function(o, i) { 
    if (i === 0) { 
    r.createdAt = moment(o.updatedAt).format("lll"); 
    } else { 
    r.createdAt = ""; 
    } 
    if (i === 1) { 
    r.authorisedAt = moment(o.updatedAt).format("lll"); 
    r.authorisedBy = o.user; 
    } else { 
    r.authorisedAt = ""; 
    r.authorisedBy = ""; 
    } 
    if (i === 2) { 
    r.receivedAt = moment(o.updatedAt).format("lll"); 
    r.receivedBy = o.user; 
    } else { 
    r.receivedAt = ""; 
    r.receivedBy = ""; 
    } 
    if (i === 3) { 
    r.creditedAt = moment(o.updatedAt).format("lll"); 
    return r.creditedBy = o.user; 
    } else { 
    r.creditedAt = ""; 
    return r.creditedBy = ""; 
    } 
})); 

структура r.logs

{ user: 54ba76d3a14c9766bc6e0c2f, 
    updatedAt: Mon Feb 16 2015 16:38:46 GMT+0000 (GMT), 
    status: 'new', 
    comments: 'test return', 
    _id: 54e21d16608eb7bc20d5451b } 0 
{ user: 54ba7c5b21f9fbb867222a95, 
    updatedAt: Mon Feb 16 2015 16:40:14 GMT+0000 (GMT), 
    status: 'authorised', 
    comments: 'EP02-BR2 is a sample, therefore return not authorised', 
    _id: 54e21d6e608eb7bc20d5451c } 1 
{ user: 54ba7c5b21f9fbb867222a95, 
    updatedAt: Mon Feb 16 2015 16:41:11 GMT+0000 (GMT), 
    status: 'received', 
    comments: 'i only got one item for EP02-BL1', 
    _id: 54e21da7608eb7bc20d5451d } 2 
{ user: 54ba7c5b21f9fbb867222a95, 
    updatedAt: Mon Feb 16 2015 16:42:59 GMT+0000 (GMT), 
    status: 'credited', 
    comments: 'credit sent', 
    _id: 54e21e13608eb7bc20d5451e } 3 

Это работает, но хотел бы знать, если это может быть сделано проще?

+0

Вы можете разместить структуру 'r.logs' тоже пожалуйста? – Jivings

+0

Упрощение, в котором манеры? – Ancient

+0

Лично мне не нравится идея модификации 'r.logs' в предикате' _.filter() '. Если возможно, я буду использовать '_.map()' (или цепочку '.map(). Filter()') вместо этого. – kamituel

ответ

1

Я хотел бы использовать switch() заявление:

log = _.filter(r.logs, (function(o, i) { 
    r.createdAt = r.authorisedAt = r.authorisedBy = r.receivedAt = r.receivedBy = r.creditedAt = ""; 
    toMoment = moment(o.updatedAt).format("lll"); 
    switch(i){ 
     case 0: 
      r.createdAt = toMoment; 
      break; 
     case 1: 
      r.authorisedAt = toMoment; 
      r.authorisedBy = o.user; 
      break; 
     case 2: 
      r.receivedAt = toMoment; 
      r.receivedBy = o.user; 
      break; 
     case 3: 
      r.creditedAt = toMoment; 
      return r.creditedBy = o.user; 
      break; 
    } 
})); 
+0

Поскольку предикат фильтра возвращает истинное значение только для четвертого элемента входного массива, не имеет ли смысл использовать 'map() [3]' вместо этого? – kamituel

0

На основании ответа @Mihai lorga в. Вот еще один подправить

llog = _.filter(r.logs, (function(o, i) { 
r.createdAt = r.authorisedAt = r.authorisedBy = r.receivedAt = r.receivedBy = r.creditedAt = ""; 
var format = "lll"; 
switch(i){ 
    case 0: 
     r.createdAt = applyFormat(o.updatedAt,format); 
     break; 
    case 1: 
     r.authorisedAt = applyFormat(o.updatedAt,format); 
     r.authorisedBy = o.user; 
     break; 
    case 2: 
     r.receivedAt = applyFormat(o.updatedAt,format); 
     r.receivedBy = o.user; 
     break; 
    case 3: 
     r.creditedAt = applyFormat(o.updatedAt,format); 
     return r.creditedBy = o.user; 
     break; 
} 
})); 
function applyFormat(date,format){ 
return moment(date).format(format); 
} 

К этому вы оленьей коже нужно изменить в каждой строке, если в будущем вам нужно изменить что-либо с форматом или датой

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