我已经在这里用其他语言阅读了多篇帖子,但这对我没有帮助。
假设我有一个数组,可以是:
[0,1,2,4,5,6,7,10]
为:
[1194,1195,1199,1299]
我需要做的是找出序列中缺少的数字。这些阵列也可能出现故障。
示例1将导致:
"Missing Frames = 3, 8-9"
示例2将导致:
"Missing Frames = 1196-1198, 1200-1298"
目前,我找到了丢失的帧,但我无法弄清楚如何像上面的字符串那样格式化它们,相反,我只是在构建一个数组。
这是我到目前为止所做的:
DEMO: http://jsfiddle.net/qBcD6/2/
任何想法?
答案 0 :(得分:1)
这可能是一种更优雅的方式,但这将为您完成工作(jsfiddle demo):
filesArray = [1195, 1201, 1202, 1203, 1205, 1001, 1002, 1004];
filesArray.sort();
var arrayLength = filesArray.length;
var lastFrame = filesArray[arrayLength - 1];
var firstFrame = filesArray[0];
var loopLength = lastFrame - firstFrame;
var missingArrayIndex = 0;
var missingFrames = new Array();
var missingFramesString = "";
for (var i = 0; i <= loopLength; i++) {
currentFrame = firstFrame + i;
console.log("currentFrame is "+(currentFrame)+" and last frame was "+missingFrames[missingArrayIndex-1]);
if (!isInArray(currentFrame, filesArray))
{
missingFrames[missingArrayIndex] = currentFrame;
// if the currentFrame is not the last missingFrame+1, then it is new sequence
if( currentFrame !== missingFrames[missingArrayIndex-1]+1)
{
missingFramesString = missingFramesString + currentFrame;
}
missingArrayIndex++;
// if not a missing frame and the currentFrame-1 was a missingFrame then it is last of sequence
} else if( currentFrame == missingFrames[missingArrayIndex-1] +1 ) {
if (missingFramesString.indexOf(missingFrames[missingArrayIndex-1]) >= 0)
missingFramesString = missingFramesString + ",";
else missingFramesString = missingFramesString + "-" + missingFrames[missingArrayIndex-1] + ",";
}
}
// remove last comma
missingFramesString = missingFramesString.replace(/,\s*$/, "");
$('body').html("Missing Frames = " + missingFramesString);
function isInArray(value, array) {
return array.indexOf(value) > -1;
}
答案 1 :(得分:0)
这样的东西?大部分来自记忆,没有机会完全测试你的小提琴..
var missingFormatted = missingFrames[0];
var current = missingFormatted;
for(var i = 1; i < missingFrames.length-1; i++)
{
if(missingFrames[i]-current > 1)
{
if(missingFrames[i-1] != current)
missingFormatted = missingFormatted + "-" + missingFrames[i-1];
missingFormatted = missingFormatted + "," + missingFrames[i];
}
}
答案 2 :(得分:0)
试试这个:
var frames = [0,1,2,4,5,6,7,10];
var convertIntArrayToStringsWithConsecutives = function(arr) {
var i = 0, result = [];
// Make sure we don't over-step the array
for(i; i < arr.length - 1; i++) {
// If next element is not consecutive
if(arr[i + 1] !== (arr[i] + 1)) {
// Print either single element when there is no gap
if(arr[i] + 1 === arr[i+1] - 1) {
result.push(arr[i] + 1);
} else {
// Or the two elements either end of the gap
result.push((arr[i] + 1) + '-' + (arr[i+1]-1));
}
}
}
return result;
}
$('body').html("Missing Frames = " + convertIntArrayToStringsWithConsecutives(frames.sort(function (a,b) {
return a - b;
}))).toString());
在这里测试: