作为更大函数的一部分,我试图简单地运行检查以查看数组中的值是否“增加”-例如:
var a = [1,2,3,4,5] // is increasing
var a = [1,4,6,7,36] // is increasing
var a = [1,6,3,6,5] // not increasing
如果先前的值a [previous]小于a [next],则此值在增加。由于某种原因,问题在于当它没有增加时它不会返回-1。而且,当我学习JavaScript时,我的代码似乎比应该的要复杂得多。
我的问题:
1.为什么a不能增加时为什么不返回-1?
2.为什么我的代码对于如此简单的测试而言如此复杂?我错过了什么吗? (也就是说,如果您认为它过于复杂,这通常是我的代码)
编写这种功能的更好方法是什么?我应该将“如果已增加测试”部分放在单独的函数中吗?如果有人也可以提供有关编写更好,更简单,可读,更简洁的代码的提示,那将不胜感激:)
var a = [1,2,3,4,5]
var canIncrease = 0; // boolean
// test if already increased
for(i=0;i<a.length;i++) {
if((a[i] < a[i+1] && i !== a.length-1)||(a[i] > a[i-1] && i==a.length-1)) {
console.log('index ' + i + ' cannot increase');
} else {
console.log('index ' + i + ' can increase');
canIncrease = 1;
}
}
if (!canIncrease) {
console.log('array a cannot increase');
return -1;
} else {
console.log('would continue');
// continue with main function...
}
答案 0 :(得分:3)
如果元素是最后一个元素或小于下一个元素,则可以使用every()
并返回true。
function func(arr) {
return arr.every((o, i, a) => (i + 1) === a.length || o < a[i + 1] );
}
console.log(func([1, 2, 3, 4, 5]));
console.log(func([1, 4, 6, 7, 36]));
console.log(func([1, 6, 3, 6, 5]));
文档:every()
答案 1 :(得分:1)
您可以使用.reduce
方法来获得所需的结果:
.reduce
方法对一个累加器和数组中的每个元素(从左到右)应用一个函数,以将其减小为单个值。
将当前元素curr
与已保存的acc
进行比较。如果当前值更大,而不是false
,则将其保存在acc
中,用于下一个元素。否则将acc
设置为false
。
最后,如果数组升序acc
将是一个整数(数组中的最后一个元素,即最大值)。其他acc
将是false
。
在语句前添加!!
,以确保将整数转换为bool。
所以该语句将如下所示:
!!a.reduce((acc, curr) => (acc && (curr >= acc)) ? curr : false)
ES6语法:
() => {}
或() =>
是定义函数(arrow functions)的简写语法
condition ? expr1 : expr2
是ternary operator,相当于if(condition) { expr1 } else { expr2 }
以下是一些测试:
const isAscOrder = (a) => !!a.reduce((acc, curr) => (acc && (curr >= acc)) ? curr : false);
console.log(
isAscOrder([2, 2, 3, 4, 5]) // is increasing
);
console.log(
isAscOrder([1, 6, 3, 6, 5]) // is not increasing
);
console.log(
isAscOrder([2, 1, 2, 3, 4, 5]) // is not increasing
);
我刚刚注意到,如果数组包含0
,则先前的功能将无法正常工作:例如:[0, 2, 2, 3, 4, 5]
。原因是0
是false
。为了解决这个问题,我们可以使用NaN
代替false
:
!isNaN(a.reduce((acc, curr) => (!isNaN(acc) && (curr >= acc)) ? curr : NaN))
const isAscOrder = (a) => !isNaN(a.reduce((acc, curr) => (!isNaN(acc) && (curr >= acc)) ? curr : NaN));
console.log(
isAscOrder([0, 2, 2, 3, 4, 5]) // is increasing
);
console.log(
isAscOrder([1, 6, 3, 6, 5]) // is not increasing
);
console.log(
isAscOrder([2, 1, 2, 3, 4, 5]) // is not increasing
);
答案 2 :(得分:1)
要回答您的最后一个问题,可以将其简化为以下内容:
var a = [1,2,3,4,5]
var b = [1,4,6,7,36]
var c = [1,6,3,6,5]
function isIncreasing(arr) {
return arr.every((n, i) => i === 0 || n[i - 1] < n);
}
isIncreasing(a); //true
isIncreasing(b); //true
isIncreasing(c); //false