У меня есть массив.Я хочу отсортировать и отфильтровать массив.Я должен был попытаться соединить .sort()
и .filter()
..sort()
работает хорошо, но не с .filter()
.Вот мой пример данных и функций, которые я сделал.Что здесь не так?
const data = [{
name: 'John',
date: '24 April 2001',
sex: 'male'
}, {
name: 'steve',
date: '12 August 2012',
sex: 'male'
}, {
name: 'natasha',
date: '13 October 1992',
sex: 'female'
}, {
name: 'chris',
date: '8 September 2004',
sex: 'remain unknown'
}]
sortAndFilter = (arr, orderBy, order, filterBy, filterValue, dataType) => {
let result;
if (filterValue === '') {
if (dataType === 'string') {
switch (order) {
case 'asc':
result = arr.sort((a, b) => a[orderBy].localeCompare(b[orderBy]));
break;
case 'dsc':
result = arr.sort((a, b) => b[orderBy].localeCompare(a[orderBy]));
break;
default:
result = arr.sort((a, b) => a[orderBy].localeCompare(b[orderBy]));
}
} else if (dataType === 'date') {
switch (order) {
case 'asc':
result = arr.sort((a, b) => new Date(a[orderBy]) - new Date(b[orderBy]));
break;
case 'dsc':
result = arr.sort((a, b) => new Date(b[orderBy]) - new Date(a[orderBy]));
break;
default:
result = arr.sort((a, b) => new Date(a[orderBy]) - new Date(b[orderBy]));
}
}
} else {
if (dataType === 'string') {
switch (order) {
case 'asc':
result = arr.sort((a, b) => a[orderBy].localeCompare(b[orderBy])).filter(el => el[filterBy] === filterValue);
break;
case 'dsc':
result = arr.sort((a, b) => b[orderBy].localeCompare(a[orderBy])).filter(el => el[filterBy] === filterValue);
break;
default:
result = arr.sort((a, b) => a[orderBy].localeCompare(b[orderBy])).filter(el => el[filterBy] === filterValue);
}
} else if (dataType === 'date') {
switch (order) {
case 'asc':
result = arr.sort((a, b) => new Date(a[orderBy]) - new Date(b[orderBy])).filter(el => el[filterBy] === filterValue);
break;
case 'dsc':
result = arr.sort((a, b) => new Date(b[orderBy]) - new Date(a[orderBy])).filter(el => el[filterBy] === filterValue);
break;
default:
result = arr.sort((a, b) => new Date(a[orderBy]) - new Date(b[orderBy])).filter(el => el[filterBy] === filterValue);
}
}
}
return result;
}
sortAndFilter(data, 'name', 'asc', 'sex', 'male', 'string');
console.log('this is not filtered: ', data);
const finalData = sortAndFilter(data, 'name', 'asc', 'sex', 'male', 'string');
console.log('this one is sorted and filtered: ', finalData);
это мой подход.В чем дело?или, может быть, есть ли лучший подход для достижения этого?Заранее спасибо.