Я использую Array.Filter как:
this.newData = this.allData.filter(imp =>
imp.name.toLowerCase().includes(((filter.name) ? filter.name.toLowerCase() : imp.name.toLowerCase())) &&
imp.type === ((filter.type) ? filter.type: imp.type) &&
imp.createdBy.toLowerCase().includes(((filter.createdBy) ? filter.createdBy.toLowerCase() : imp.createdBy.toLowerCase()))
)
Но мое imp.name иногда может быть нулевым, поэтому код выдает ошибку.
Как я могу добавить оператор if внутри фильтра, чтобы, если какие-либо данные были нулевыми, не добавляйте их в AND.
Что-то типа
if (imp.name!=null){
imp.name.toLowerCase().includes(((filter.name) ? filter.name.toLowerCase() : imp.name.toLowerCase()))
}
Надеюсь, я ясно.
Используйте обычную функцию и возвращайте true или false по мере необходимости...
@HereticMonkey Я фильтрую это на основе всех условий, которые состоят из 3 условий, как в моем примере. Если я использую индивидуальный if else и возвращаю true false, как будут объединяться результаты. Так что в основном это критерии поиска. Если выбранный фильтр соответствует массиву, верните отфильтрованный список, иначе верните все.
Поэтому определите логическое значение вверху, которое показывает, удовлетворяет ли элемент фильтру. Установите значение true или false в зависимости от различных проверок, которые вы делаете. Я предполагаю, что если какое-либо из условий не выполняется, его не следует включать в список? Просто выполните var passedFilter = true; passedFilter = passedFilter && (condition1); passedFilter = passedFilter && (condition2);
... и т. д. По базовой логической логике, если какие-либо из них ложны, они не будут включены.
См. проверка оператора if на наличие нескольких логических условий, чтобы узнать больше о том, как это сделать.
Для достижения ожидаемого результата используйте приведенную ниже опцию использования imp && imp.name в первой строке фильтра.
imp.name && imp.name.toLowerCase().includes(((filter.name)
Кодепен — https://codepen.io/nagasai/pen/EzowXb?editors=1010
рабочий код:
var allData = [{name: null , type: "A", createdBy: 'test1'},
{name: 'aaaa' , type: "AB", createdBy: 'test12'},
{name: 'bbbb' , type: "AA", createdBy: 'test13'},]
var filter = {name: 'bbbb' , correctionType: "AA", createdBy: 'test13'}
var newData = allData.filter(imp =>
imp.name && imp.name.toLowerCase().includes(((filter.name) ? filter.name.toLowerCase() : imp.name.toLowerCase())) &&
imp.type === ((filter.type) ? filter.correctionType : imp.type) &&
imp.createdBy.toLowerCase().includes(((filter.createdBy) ? filter.createdBy.toLowerCase() : imp.createdBy.toLowerCase()))
)
console.info(newData)
Если вы хотите проверить, существует ли фильтр, и использовать его, только если он существует, я бы сделал что-то вроде этого:
items.filter(imp => {
let keep = true;
if (imp.name) {
keep = keep && imp.toLowerCase().includes(filter.name ? filter.name.toLowerCase() : imp.name.toLowerCase());
}
if (imp.type) {
keep = keep && imp.type === (filter.type ? filter.correctionType : imp.type);
}
if (imp.createdBy) {
keep = keep && imp.createdBy.toLowerCase().includes(filter.createdBy? filter.createdBy.toLowerCase(): imp.createdBy.toLowerCase());
}
return keep;
});
Лично я считаю, что это пример чрезмерного использования троичных элементов. Потребовалось некоторое время, чтобы понять логику, и даже тогда я думаю, что это не решает точную требуемую фильтрацию.
Фильтр здесь не показан, поэтому мы можем только догадываться.
this.newData = this.allData.filter(imp => {
// Check if the properties we'll call methods on, are true-ty values.
if ( !imp.name || !imp.createdBy ) return false;
// imp.name.toLowerCase().includes( imp.name.toLowerCase()) is always true.
// So the only way the name is invalid,
// is if filter.name exists AND filter.name is not included inside imp.name.
// So !filter.name gives us true if filter.name does not exist
// and also makes sure filter.name exists before we try to use toLowerCase();
const valid_name = !filter.name || imp.name.toLowerCase().includes( filter.name.toLowerCase());
// Same here imp.type will always equal imp.type, so the ternary is redundant again.
// The type will only be false if imp.type does not equal filter.correctionType
const valid_type = !filter.type || imp.type === filter.correctionType;
// Same again
const valid_creation = !filter.createdBy || imp.createdBy.toLowerCase().includes( filter.createdBy.toLowerCase());
// All 3 have to be true.
return valid_name && valid_type && valid_creation;
});
можете ли вы вставить данные, т.е. значение фильтра и значения this.allData?