Я пытаюсь фильтровать, а затем сортировать массив чисел и строк, но мой код не работает - PullRequest
2 голосов
/ 05 апреля 2019

У меня есть массив букв и цифр.

let sortLetters = [ 'R', '1', 'U', '1', 'N', '1', 'D', '1', 'M', '1', 'C', '1' ]

Я хочу отсортировать типы по алфавиту, а затем вернуть первую встреченную букву.

Мой ожидаемый результат должен быть C.

. В настоящее время мой код сортирует все типы правильно, но если я пытаюсь отфильтровать числа, он не возвращает то, что мне нужно.Любая помощь приветствуется.

let sortLetters = [ 'R', '1', 'U', '1', 'N', '1', 'D', '1', 'M', '1', 'C', '1' ]

const sortBothType =(arr)=> {
  return [...arr].sort((a, b) => a.localeCompare(b));
}

const getFirstLetter = (arr) =>{
  let result = ''
  for(let x = 0; x <= arr.length;x++){
    if( parseInt(arr[x]) === 'string'){
      return arr[x]
    }
  }
}

let sortedType = sortBothType(sortLetters)
sortedType
getFirstLetter(sortedType)
let finalResult = getFirstLetter(sortedType)


Ответы [ 7 ]

3 голосов
/ 05 апреля 2019

Сначала отфильтруйте все цифры, затем отсортируйте и, наконец, получите доступ к первому элементу массива.Это даст вам ваш C в примере:

sortLetters.filter(x=>/\D/.test(x)).sort()[0]
3 голосов
/ 05 апреля 2019

Вы можете взять первый найденный NaN, используя Array#find и isNaN .

const
    sortBothType = ([...array]) => array.sort((a, b) => a.localeCompare(b));
    getFirstLetter = array => array.find(isNaN);

let sortLetters = [ 'R', '1', 'U', '1', 'N', '1', 'D', '1', 'M', '1', 'C', '1'],
    sortedType = sortBothType(sortLetters);

console.log(getFirstLetter(sortedType));
console.log(sortedType);
0 голосов
/ 05 апреля 2019

Вы можете использовать оператор ИЛИ в функции сравнения, чтобы группировать отсортированные алфавиты и числа отдельно:

let array = [ 'R', '1', 'U', '1', '2', 'N', '1', 'D', '1', 'M', '1', 'C', '1' ]

let customSort = [...array].sort((a, b) => isNaN(b) - isNaN(a) || a.localeCompare(b))

console.log(customSort)
console.log(customSort[0])
0 голосов
/ 05 апреля 2019
  • Мы можем отфильтровать из чисел путем преобразования алфавитов в массиве в NaN. Добавление арифметического оператора, такого как +, преобразует ненулевое число в NaN

  • Затем отфильтруйте их, используя Number.isNaN() и отсортируйте массив отфильтрованных алфавитов, в котором первый элемент будет C.

let sortLetters = [ 'R', '1', 'U', '1', 'N', '1', 'D', '1', 'M', '1', 'C', '1' ]
const sortBothType =(arr)=> {
  return arr.filter(a => isNaN(+a)).sort((a,b) => a.localeCompare(b));
}
let [firstLetter, ...rest] = sortBothType(sortLetters);
console.log(firstLetter)
0 голосов
/ 05 апреля 2019
let sortLetters = ', '1', 'U', '1', 'N', '1', 'D', '1', 'M', '1', 'C', '1']

console.log(
    sortLetters.map(item => isNaN(parseInt(item)) ? item : null).sort()[0]
);

объяснение

1 На карте fn мы проверяем каждый элемент, является ли он числом или нет.Метод ParseInt подходит, когда вы хотите проверить, есть ли у строкового значения число внутри или нет.Если нет, возвращает isNaN - так же и строка.

2 Тернарный оператор?: В функции карты помогите нам создать новый массив с результатом проверки, который мы сделали в 1.

3 Метод Mapвозвращает массив только с не числовыми символами, поэтому мы можем использовать метод сортировки для сортировки по алфавиту.

4 [0] - просто вернуть firstitem из отсортированного списка букв.

0 голосов
/ 05 апреля 2019

Вы сравниваете результат parseInt() с 'string', вместо этого используйте isNaN () .

Кроме того, если вы сначала фильтруете числа, вам не нужно будет копировать массив, и вы можете использовать sort () без аргументов. Затем используйте shift () , чтобы получить первую букву:

const letters = [ 'R', '1', 'U', '1', 'N', '1', 'D', '1', 'M', '1', 'C', '1' ];

console.log(letters.filter(isNaN).sort().shift());
0 голосов
/ 05 апреля 2019

Поскольку вам нужна только буква, вы можете использовать Array.reduce(), чтобы получить «самую маленькую» букву. Вы можете игнорировать числа, используя isNaN(), и принимая элементы, которые возвращают true.

const sortLetters = ['R', '1', 'U', '1', 'N', '1', 'D', '1', 'M', '1', 'C', '1' ]

const result = sortLetters.reduce((r, char) => 
  !isNaN(r) || (isNaN(char) && char < r) ? char : r
)

console.log(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...