сортировка по цепочке и фильтр не работают javascript

#javascript #arrays #sorting #filter

#javascript #массивы #сортировка #Фильтр

Вопрос:

У меня есть массив. Я хочу отсортировать и отфильтровать массив. Я попытался объединить в цепочку .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 resu<
  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 resu<
}

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);  

это мой подход. Что не так? или, может быть, есть какой-нибудь лучший подход для достижения этого? Заранее благодарю вас.

Комментарии:

1. кажется, работает нормально?

2. фильтр не

3. как так получилось? Пожалуйста, приведите какой-нибудь пример, например, чего вы ожидаете и что отображается?

4. sortAndFilter(данные, ‘имя’, ‘asc’, ‘пол’, ‘мужской’, ‘строка’);, я ожидаю, что результатом будут только john и steve, и порядок будет john, затем steve, поскольку я упорядочиваю его по имени и по возрастанию.

5. Если вы запустите фрагмент, вот что вы получите. Однако сортировка изменяет массивы, а filter — нет… Итак, если вы проверите свой исходный аргумент, он будет отсортирован, но не отфильтрован. Однако возвращаемое значение будет отфильтровано.

Ответ №1:

Спасибо @GarretMotzner и @AnikIslamAbhi за помощь в разделе комментариев. Гаррет уже указал, что происходит не так. Функция не ошибочна, но мне просто нужно сохранить отфильтрованный массив в новой переменной. Потому что .filter() не изменил массив. Я обновил вопросы, включающие ответ выше

Комментарии:

1. Я бы сказал, что, поскольку вы выполняете сортировку, вы, вероятно, захотите сначала выполнить неглубокий клонирование массива, чтобы в конечном итоге не изменять массив. Это, вероятно, избавит вас от некоторых ошибок в будущем.

2. @GarrettMotzner отметил. Спасибо за ваш совет. Я действительно ценю это