Ric*_*dus 9 javascript arrays jquery
假设我在Javascript中有一个整数数组,我想检查它的所有值是否按升序排列.我想要的是将数组键保存在另一个数组中,以防算法找到一个较低(或相等)的值,不仅要比较前一个值,还要比较它之前的任何值.我做的是这样的:
arr = [], nonvalid = [];
for (var j = 1; j < arr.length; j++){
if ( arr[j+1] <= arr[j] ){
nonvalid.push(j);
}
}
Run Code Online (Sandbox Code Playgroud)
显然,上面的算法只检查比较之前的值更低的值.
数组可能包含以下值:
ARR = 1,2,3,10,5,11,12,2,4,25
无效值是粗体值.如果我运行上面的循环,它将不会"捕获"倒数第二个(4),因为它高于其最近的左兄弟,但不高于其所有左兄弟.
编辑:
尝试了以下解决方案,除了我之外,没有返回此数组的所有无效值.:(
他们纠正了最后两个值,但不是第二个.我不明白为什么.
[24398,24397,25004,25177,26302,28036,29312,29635,29829,30476,32595,33732,34995,36047,36363,37310,38022,38882,40746,41212,42846,43588,44029,44595,44846 ,45727,46041,4729,38002,48930,49858,51184,51560,53895,54247,54614,55713,56813,57282,57480,57875,58073,58403,60321,61469,62051,62310,62634,63217,64505 ,65413,65677,65940,66203,66572,67957,68796,68964,69098,69233,69435,69759,71496,72577,72823,73007,73252,73743,73866,76405,77037,77416,77669,79691,80885 ,81339,81794,82067,82431,83244,84861,86836,88632,89877,90296,91049,91885,92351,92614,93141,93733,93930,94531,95206,95882,96895,97732,97973,99261,99422 ,99583,100332,100599,101666,102066,102600,103504,104432,105174,107216,109085,110181,110679,111177,111988,112553,113005,113457,600,600 ]
跟踪您所看到的最大值(请参阅小提琴):
function find_invalid_numbers(arr) {
var nonvalid, i, max;
nonvalid = [];
if (arr.length !== 0) {
max = arr[0];
for (i = 1; i < arr.length; ++i) {
if (arr[i] < max) {
nonvalid.push(arr[i]);
} else {
max = arr[i];
}
}
}
return nonvalid;
}
Run Code Online (Sandbox Code Playgroud)
这样做的另一种非常好的功能方式可能是;
var isAscending = a => a.slice(1)
.map((e,i) => e > a[i])
.every(x => x);
console.log(isAscending([1,2,3,4]));
console.log(isAscending([1,2,5,4]));Run Code Online (Sandbox Code Playgroud)
不错的代码,但其中有冗余。我们可以通过将.map()和合并.every()为一个来进一步简化。
var isAscending = a => a.slice(1)
.every((e,i) => e > a[i]);
console.log(isAscending([1,2,3,4]));
console.log(isAscending([1,2,5,4]));Run Code Online (Sandbox Code Playgroud)
当您发现某个元素乱序时,请查看下一个元素,直到它们相对于乱序元素之前的元素不再乱序。
将无序元素添加到第二个数组,然后从新的有序元素继续。
var outs= [], L= A.length, i= 0, prev;
while(i<L){
prev= A[i];
while(A[++i]<prev) outs.push(i);
}
alert(outs)
Run Code Online (Sandbox Code Playgroud)