使用jQuery检查宿舍是否按顺序排列

时间:2014-07-16 08:25:06

标签: javascript jquery

我有季度名单。

var quarters = new Array();
quarters.push("Q1 2014");
quarters.push("Q2 2014");
quarters.push("Q4 2014");
quarters.push("Q1 2015");

这里的季度不是顺序的。 " 2014年第3季度"不见了。 如何使用jquery检查这些是否顺序?

2 个答案:

答案 0 :(得分:1)

  1. 对数组进行排序(您需要一个回调比较函数来传递给sort

  2. 循环播放数组,将“当前”条目与之前的条目进行比较,以查看是否恰好是四分之一

  3. 在这两种情况下,你可能需要一些解析字符串的东西,所以你有一个四分之一的数字和一年,而不是一个组合它们的字符串。解析很简单,你可以使用正则表达式:

    var parts = str.match(/^Q(\d) (\d{4})$/);
    

    ...然后parts[1]是季度,parts[2]是年份。

    我通常不是提供所有代码的粉丝,但因为现在有不正确的代码围绕这个问题:

    var quarters = [
        "Q1 2014",
        "Q2 2014",
        "Q4 2014",
        "Q1 2015"
    ];
    var prev, i, curr;
    
    // Sort the quarters according to their quarter value (see `qval` below)
    quarters.sort(function(a, b) {
        return qval(a) - qval(b);
    });
    
    // Find gaps by starting at the beginning and comparing each entry
    // to the one just in front of it
    prev = qval(quarters[0]);
    for (i = 1; i < quarters.length; ++i) {
        curr = qval(quarters[i]);
        if (curr !== prev + 1) {
            console.log("Gap found between " + quarters[i - 1] + " and " + quarters[i]);
        }
        prev = curr;
    }
    
    // `qval` parses a quarter string ("Q2 2014", for instance) and returns a
    // a number for the quarter: The year times four plus the quarter
    // within the year (e.g., 8058 for Q2 2014). For easy comparison.    
    function qval(quarterString) {
        var qv, parts;
    
        parts = quarterString.match(/^Q(\d) (\d{4})$/);
        if (!parts) {
            throw "Invalid quarter string: '" + quarterString + "'";
        }
        qv = (parseInt(parts[2]) * 4) + parseInt(parts[1]);
        return qv;
    }
    

    Live Copy

答案 1 :(得分:-1)

以下代码将首先对列表进行排序,然后标记打破序列的任何缺失的季度。但是,它不会标记打破序列的缺失区域,例如Q3 / Q4不会被标记为2015年失踪

var quarters = new Array();
quarters.push("Q1 2014");
quarters.push("Q2 2015");
quarters.push("Q1 2016");
quarters.push("Q4 2014");
quarters.push("Q2 2014");
quarters.push("Q1 2015");
// sort list before sequence check
quarters.sort(function(a, b) {
    a = strToQtr(a);
    b = strToQtr(b);
    return a.year === b.year ? a.qtr - b.qtr : a.year - b.year;
});
// check sequence order of each quarter, flag if sequence is broken
var prev;
for (var i = 0; i < quarters.length; i++) {
    var cur = strToQtr(quarters[i]);
    if (prev && prev.year === cur.year && (cur.qtr - 1) !== prev.qtr) {
        console.log('Q' + (cur.qtr - 1) + ' ' + cur.year + ' is missing!');
    }
    console.log(quarters[i]);
    prev = cur;
}
// string parser
function strToQtr(value) {
    var parts = value.split(' ');
    return {
        qtr: parseInt(parts[0].replace('Q', '')),
        year: parseInt(parts[1])
    };
};

Live example