我试图过滤然后对数字和字符串数组进行排序,但我的代码不起作用



我有一个字母和数字数组。

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)

首先过滤掉所有数字,然后排序,最后访问第一个数组成员。这将在示例中为您提供C

sortLetters.filter(x=>/D/.test(x)).sort()[0]
您可以使用

Array#find和isNaN获取第一个找到的NaN

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

由于您只需要字母,因此您可以使用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)

您可以使用 compareFunction 中的 OR 运算符将排序后的字母和数字分别分组:

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

  • 我们可以通过将数组中的字母转换为 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)

您正在比较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());

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 在 map fn 中,我们检查每个项目,是否是数字。 ParseInt 方法是合适的,当您想检查字符串值是否包含数字时。如果不是,则返回 isNaN - 字符串也是如此。

2 三元运算符 ?:在 map 函数中帮助我们使用我们在 1 中所做的检查结果创建新数组。

3 Map 方法返回的数组只有没有数字字符,因此我们可以使用排序方法按字母顺序排序。

4 [0] - 只需从排序的字母列表中返回第一项。

最新更新