返回无效的代码

时间:2018-06-21 15:42:48

标签: javascript

作为更大函数的一部分,我试图简单地运行检查以查看数组中的值是否“增加”-例如:

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...
}

3 个答案:

答案 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 : expr2ternary 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]。原因是0false。为了解决这个问题,我们可以使用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