以特定模式格式化数组编号

时间:2014-04-22 01:04:37

标签: javascript jquery string formatting format

我已经在这里用其他语言阅读了多篇帖子,但这对我没有帮助。

假设我有一个数组,可以是:

[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/

任何想法?

3 个答案:

答案 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());

在这里测试:

http://jsfiddle.net/5k86J/6/