2015-07-22 3 views
0

Я использую Underscore.js в своем проекте и натолкнулся на странное поведение. Когда я фильтрую массив с changes_summary === 2, я получаю желаемый результат, но когда я использую то же самое с changes_summay === 0, я не получаю никакого вывода.странное поведение при использовании Underscore при тестировании равно условию

Ниже приводится код:

var result={ 
    "data": [ 
    { 
     "id": 956, 
     "changes_summary": 2, 
     "name": "Pradeep", 
     "age": 32 
    }, 
    { 
     "id": 956, 
     "changes_summary": 0, 
     "name": "praveen", 
     "age": 22 
    } 
    ] 
} 


var filtered = _.filter(result.data, function(obj){ 
    return (obj.changes_summary && obj.changes_summary === 2) 
}); 
//working when comparing with changes_summary with 2 but not working when comparing with 0 
console.log(filtered); 

Пожалуйста, дайте мне знать, где я неправильно. Ссылка на Jsfiddle прилагается: Jsfiddle

+0

'obj.changes_summary &&' удалить это, чтобы проверить на '0'. '0' является' falsy' См. Https://jsfiddle.net/tusharj/2j13o0be/1/ – Tushar

+0

@ Тушара, удаляющего его, не обязательно обязательно. Если фильтр должен применяться только к объектам, которые определенно обладают свойством, то необходим дополнительный тест. – Pointy

ответ

1

Первый тест — obj.changes_summary — потерпит неудачу, когда значение свойства 0 потому что это falsy значение. Если вы тестируете, есть ли свойство в объекте, вы можете сделать это:

return (("changes_summary" in obj) && obj.changes_summary === 0); 
+0

Действительно ли 'in' нужен? –

+1

@muistooshort хорошо это зависит от намерения - если идея состоит в том, чтобы отфильтровать объекты, которые определенно имеют свойство * и *, для которых значение свойства равно '0', тогда это необходимо. Если объекты без свойства должны обрабатываться так, как если бы значение свойства было '0', то нет. – Pointy

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