请教如何理解这段三元运算符实现的数组排序判定代码
关于JavaScript数组排序判断代码的疑问
我花费两天时间仍无法理解这段JavaScript代码如何判断输入数组为升序、降序或未排序。尤其对其中使用三元运算符实现的升序、降序检查逻辑感到困惑,自己推导升序逻辑看似可行,但推导降序时出现矛盾,怀疑对(element, index)参数的理解有误,特附上代码及自身推导过程寻求帮助。
const arraySortInfo = (inputArray) => { if (inputArray.some((element) => typeof element !== "number")) { return "Some elements are not numbers"; } if ( inputArray.every((element, index) => index > 0 ? element >= inputArray[index - 1] : true ) ) { return "Array sorted by ascending"; } if ( inputArray.every((element, index) => index > 0 ? element <= inputArray[index - 1] : true ) ) { return "Array sorted by descending"; } return "Array isn't sorted"; }; const a = [5, "abc", 10, 1]; const b = [4, 10, 14, 25, 25, 50]; const c = [150, 132, 80, 40]; const d = [15, 26, 10, 23, 85];
我对升序检查逻辑的推导过程:
以inputArray[4,7,10]为例,调用every((element, index) => { 第一次:index为0,0>0不成立,返回true 第二次:index为1,1>0成立,判断7 >= inputArray[0]即7>=4,返回true 第三次:index为2,2>0成立,判断10 >= inputArray[1]即10>=7,返回true *若所有判断都为true则返回"Array sorted by ascending"*
但用同样方式推导降序逻辑时无法成立,故寻求帮助。
核心逻辑解释
首先你对(element, index)参数的理解是完全正确的:element是当前遍历到的数组元素,index是该元素在数组中的索引。
降序逻辑的正确推导
拿示例数组c = [150, 132, 80, 40]来完整走一遍降序检查流程:
调用every((element, index) => { 第一次:index为0,0>0不成立,直接返回true 第二次:index为1,当前element是132,判断132 <= inputArray[0](即150),条件成立,返回true 第三次:index为2,当前element是80,判断80 <= inputArray[1](即132),条件成立,返回true 第四次:index为3,当前element是40,判断40 <= inputArray[2](即80),条件成立,返回true 所有遍历判断都为true,因此返回"Array sorted by descending"
你之前推导降序出现矛盾,大概率是搞反了比较方向——降序检查的逻辑是当前元素 <= 前一个元素,而非前一个元素 <= 当前元素。这段代码的核心判断规则是:
- 升序:从第二个元素开始,每个元素都大于等于它的前一个元素
- 降序:从第二个元素开始,每个元素都小于等于它的前一个元素
补充细节
- 代码中使用
>=和<=而非严格的>和<,因此允许数组中存在重复元素(比如示例数组b里的两个25,不会影响升序判断结果) - 若输入数组为空或只有一个元素,会同时满足升序和降序的
every判断,但由于升序判断分支在前,最终会返回升序结果
内容的提问来源于stack exchange,提问作者Celeron
相关产品推荐
相关产品推荐

