2016-09-03 3 views
1

Что правильный способ сделать фильтр на массив внутри переключателя заявлениеJavascript обратный отфильтрованный массив внутри переключателя заявление

let filteredMachines = (filterTerm,filterField) => { 
     switch (filterField) { 
     case 'NomAppareil':this.props.machines.filter(machine => { 
      return machine.nomAppareil === filterTerm; 
     }); 
     break; 

     case 'CodeAppareil':this.props.machines.filter(machine => { 
      return machine.codeAppareil === filterTerm; 
     }); 
     break; 

     case 'NomClient':this.props.machines.filter(machine => { 
      return machine.nomClient === filterTerm; 
     }); 
     break; 

     case 'CodeClient':this.props.machines.filter(machine => { 
      console.log('inside CodeClient ='+JSON.stringify(machine)); 
      return (machine.codeClient == filterTerm); 
     }); 
     break; 

     case 'NoSerie':this.props.machines.filter(machine => { 
      return machine.noSerie === filterTerm; 
     }); 
     break; 

     default: return this.props.machines; 
    } 
    }; 

Edit: я нашел рабочий раствор приведенной ниже

let filteredMachines = machines.filter((machine) =>{ 
    switch (filterField) { 
    case 'NomAppareil': return machine.nomAppareil === filterTerm; 
    case 'CodeAppareil': return machine.codeAppareil === filterTerm; 
    case 'NomClient': return machine.nomClient === filterTerm; 
    case 'CodeClient': return machine.codeClient === filterTerm; 
    case 'NoSerie': return machine.noSerie === filterTerm; 
      default: return true; 
    } 

});

+0

В чем главная проблема? Вышеупомянутый код не работает ИЛИ вы ищете оптимизированный (рефакторизованный) подход? – RomanPerekhrest

+0

Код не работает – AGdev

+0

, пожалуйста, добавьте несколько вариантов использования и желаемый результат и ошибки, которые вы получите. –

ответ

0

Вы можете сделать следующее:

var filters = ["NomAppareil","CodeAppareil","NomClient","CodeClient","NoSerie"], 
    result = filters.indexOf(filterField) !== -1 ? this.props.machines.filter(machine => machine[filterField] === filterTerm) 
                : this.props.machines; 
2

В основном вам нужно вернуть отфильтрованной массив (отсюда undefined результата), то вы можете опустить заявление перерыва.

case 'NomAppareil': 
    return this.props.machines.filter(machine => { 
// ^^^^^^ 
     return machine.nomAppareil === filterTerm; 
    }); 
    // break; 

Или использовать Set вместо switch заявления.

let filteredMachines = (filterTerm, filterField) => { 
    var set = new Set(['NomAppareil', 'CodeAppareil', 'NomClient', 'CodeClient', 'NoSerie']); 
    return set.has(filterField) ? 
     this.props.machines.filter(machine => machine[filterField] === filterTerm) : 
     this.props.machines; 
}; 
+0

Часть, использующая истребимый объект 'Set', очень умна. Хорошо заслужил +1 за это. – briosheje

+0

Будет ли над кодом работать, если машина является объектом Json – AGdev

+0

Я не знаю, что это такое и как вы выглядите. возможно, вам нужно сначала проверить наличие существующего объекта, если применить назначение 'filterMachines'. –

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