我有一个数组验证值是否按降序排序。但是,如果序列的值为0,则会中断该过程并返回false而不是true。我如何避免0值并继续下降过程。 https://jsfiddle.net/snb3p0qy/1/
function customValidate(array) {
var length = array.length;
return array.every(function(value, index) {
var nextIndex = index + 1;
return nextIndex < length ? value >= array[nextIndex] : true;
});
}
document.write(customValidate([1, 2, 3, 4, 5]));
document.write(customValidate([5, 0, 3, 2, 1]));//This supposed to be true
document.write(customValidate([0, 0, 0, 4, 5]));
document.write(customValidate([0, 0, 0, 2, 1]));
答案 0 :(得分:3)
如果您希望继续使用every
方法,可以在进行测试之前过滤掉0
。
function customValidate(array) {
'use strict'
return array.filter(item => item != 0).every(function(value, index, filteredArray) {
// instead of referencing the original array the filtered
// array that is pass as third argument to every is used
var nextIndex = index + 1;
return nextIndex < filteredArray.length ? value >= filteredArray[nextIndex] : true;
});
}
但这种方法的缺点是你将创建一个新的临时数组。因此,对于大数据,这种方法不能很好地扩展。
更好的想法是使用常规循环来测试它。可能类似的东西(这肯定不是最好的代码):
function customValidate(array) {
'use strict'
var length = array.length;
// set i to the index of the first value that is not 0
var i = array.findIndex(value => value != 0);
var lastItem = array[i];
i++;
// after the first item was found, loop to the end of the list
while (i < length) {
// if the current item is not 0 then do the compare otherwise skip the test.
if (array[i] != 0) {
if (array[i] > lastItem) {
return false;
}
lastItem = array[i];
}
i++;
}
return true;
}
目前并非所有浏览器都支持Array.prototype.findIndex(),但您可以使用MDN网站上显示的polyfill,或者将其替换为循环。
编辑我在filter
示例中遇到错误,因为过滤后的数组必须用作参考。
答案 1 :(得分:2)
尝试以下return语句
return nextIndex < length ? value === 0 || value >= array[nextIndex] : true;
甚至
return nextIndex >= length || value === 0 || value >= array[nextIndex];
因此我编辑了代码以使其适用于[5,0,1]场景但当然使用for循环会更好,如第二个答案。
while (array[nextIndex] === 0 && nextIndex < length) {
nextIndex++;
}
return nextIndex >= length || value === 0 || value >= array[nextIndex];