var arr = [
[ 1234, 3456 ],
[ 1324, 2345 ],
[ 6355 ],
[ 2234 ],
[ 8345 ],
[ 1234, 6355 ]
];
var i = arr.length;
while(i--){
var current = arr[i];
if(i == 0){
break;
}
var before = arr[i-1];
if(!before[1]) continue;
var result = current[1] - before[1]
console.log(result)
}
在上面的代码中,仅在 0 索引中具有值的子数组将被消除,因为 if(!before[1]) continue;
。如果运行此代码,结果为 NaN
然后是 -1111
,其中 NaN
是因为 arr[2][1]
是 未定义
而之前
是2345
。 -1111
是因为 arr[1][1]
是 2345
和 arr[0][1]
是 3456
所以从当前之前减去之前得到 -1111
。
正如您所看到的,arr
的最后一个索引中的数组被绕过,而它的第一个索引 [1234, 6355]
中具有值。但在这种情况下,current
可能首先等于 arr[5][1]
,然后等于 arr[1][1]
> 首先。我想要完全相同的事情,当数组在索引零中没有任何值时,仅对于 before
变量,而 current 保留该值,直到找到之前。
在此示例中不久,结果应该是:
6355 - 2345 = 4010//arr[5][1] - arr[1][1]
2345 - 3456 = -1111//arr[1][1] - arr[0][1]
但目前只是
NaN//arr[2][1] - arr[1][1]
-1111/arr[1][1] - arr[0][1]
当未找到 before
时,不应消除任何 current
;当未找到 current
时,不应消除任何 before
最佳答案
如果我正确理解了您的问题,您将尝试对每个连续的 arr[n][1]
进行递减,排除那些 arr[n]
,只有一名成员。
你可以这样做:
var arr = [
[1234, 3456],
[1324, 2345],
[6355],
[2234],
[8345],
[1234, 6355]
],
i = arr.length,
result, firstOperand;
while (i--) {
if (typeof firstOperand === 'undefined') { // No first operand
firstOperand = arr[i][1]; // Set the first operand
continue;
}
if (arr[i].length < 2) {continue;} // No second operand, continue
result = firstOperand - arr[i][1];
firstOperand = arr[i][1]; // Set a new first operand
console.log(result);
}
诀窍是,将第一个操作数存储到变量中。然后检查它是否有值。如果不是,则分配 1 并继续循环。然后检查第二个操作数是否在当前索引处进行递减。如果没有找到,则继续循环。然后,当您拥有两个操作数时,进行数学计算,并分配一个新的 firstOperand
。
请注意,typeof
检查还允许您使用零作为值。当 arr
中最后一些成员的长度为 1,或者甚至根本没有有效成员时,该代码也可以工作。
关于JavaScript 高级循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33943080/