【问题标题】:Range of Years in JavaScript for a select boxJavaScript 中选择框的年份范围
【发布时间】:2009-10-15 21:41:29
【问题描述】:

我正在尝试在 JavaScript 中创建一个动态选择框,其中包含从“某个”年份开始到当前年份结束的年份。 JavaScript 中有没有类似 Ruby 的 range 类的东西,还是我必须使用 for 循环来循环这些年?

这就是我想出的,尽管我认为在 Ruby 中考虑的有点多,我可以只使用一个范围。

    this.years = function(startYear){
        startYear = (typeof(startYear) == 'undefined') ? 1980 : startYear
        var currentYear = new Date().getFullYear();
        var years = []
        for(var i=startYear;i<=currentYear;i++){
            years.push(i);
        } 
        return years;
    }

【问题讨论】:

    标签: javascript arrays range


    【解决方案1】:

    JavaScript 确实有一个 Range 对象,但它指的是 DOM 的任意部分,并且在 IE 6/7 中不受支持。

    如果你愿意,你可以将你的函数简化为这个,但实际上都是一样的。

    this.years = function(startYear) {
        var currentYear = new Date().getFullYear(), years = [];
        startYear = startYear || 1980;  
        while ( startYear <= currentYear ) {
            years.push(startYear++);
        }   
        return years;
    }
     
    console.log( this.years(2019-20));

    【讨论】:

    • 完美。我没有意识到你可以使用 ||运算符而不是与 typeof() 混淆。
    • 是的,但前提是 false/null 对于您正在处理的任何事情都是无效值。这是为默认参数提供解决方法的一种非常常见的方法。
    【解决方案2】:

    使用Array.from

    const currentYear = (new Date()).getFullYear();
    const range = (start, stop, step) => Array.from({ length: (stop - start) / step + 1}, (_, i) => start + (i * step));
    console.log(range(currentYear, currentYear - 50, -1)); 
    // [2019, 2018, 2017, 2016, ..., 1969]

    【讨论】:

    • 最佳答案在这里。
    【解决方案3】:

    如果您正在编译或不担心 IE 用户,请使用 Array.fill()

    const now = new Date().getUTCFullYear();    
    const years = Array(now - (now - 20)).fill('').map((v, idx) => now - idx);
    
    // (20) [2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012, 2011, 2010, 2009, 2008, 2007, 2006, 2005, 2004, 2003, 2002, 2001, 2000]
    

    打字稿

    get years() {
      const now = new Date().getUTCFullYear();
      return Array(now - (now - 20)).fill('').map((v, idx) => now - idx) as Array<number>;
    }
    

    【讨论】:

    • 不错。谢谢!
    • const years = Array(20)).fill('').map((v, idx) => now - idx);
    【解决方案4】:

    如果您正在寻找单行答案,您可以在一行中使用 Array.from 来创建年份列表。

    Array.from(Array(new Date().getFullYear() - 1949), (_, i) => (i + 1950).toString())
    

    这将创建从 1950 年到当前年份的年份。该功能将在所有浏览器中运行

    【讨论】:

      【解决方案5】:

      虽然上述答案完美无缺,但我只会为lodash 添加一个答案 用户。

      _.range([start=0], end, [step=1])

      创建一个数字数组(正数和/或负数),从开始到结束,但不包括结束。

      我将 1 添加到 max,因为 lodash 不包括 end 在范围内。

      这将创建一个从 60 年前到现在的年份数组。

      如果你想要相反的顺序,你可以使用_.rangeRight

      const max = new Date().getUTCFullYear();
      const min = max - 60;
      const yearRange = _.range(min, max + 1);
      
      console.log(yearRange);
      &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"&gt;&lt;/script&gt;

      【讨论】:

        【解决方案6】:

        const years = [...Array(new Date().getFullYear() - 1989).keys()].map((e)=>e+1990)

        这将生成从 1990 年到当前年份的年份列表 [1990,1991,.....2021]

        【讨论】:

          【解决方案7】:

          不幸的是,不,Javascript 中没有可与 Ruby 相媲美的“范围”函数,因此您必须使用循环来完成。不过,看起来你正在做的事情应该可行。

          【讨论】:

            【解决方案8】:

            您可以在 javascript 中提供 range 方法,但您需要大量使用它才能将其包含在源代码中。

            var A= Array.from(-5,5) >>> 返回值:

            (数组)-5,-4,-3,-2,-1,0,1,2,3,4,5

            var B= Array.from(10,100,10) >>> 返回值:

            (数组)10,20,30,40,50,60,70,80,90,100

            var C= Array.from('a','z') >>> 返回值:

            (数组)a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v, w,x,y,z

            Array.from= function(what, n, step){
                var A= [];
                if(arguments.length){
                    if(n){
                        return A.range(what, n, step)
                    }
                    L= what.length;
                    if(L){
                        while(L){
                            A[--L]= what[L];
                        }
                        return A;
                    }
                    if(what.hasOwnProperty){
                        for(var p in what){
                            if(what.hasOwnProperty(p)){
                                A[A.length]= what[p];
                            }
                        }
                        return A;
                    }
                }
                return A;
            }
            
            Array.prototype.range= function(what, n, step){
                this[this.length]= what;
                if(what.split && n.split){
                    what= what.charCodeAt(0);
                    n= n.charCodeAt(0);
                    while(what<n){
                        this[this.length]= String.fromCharCode(++what);
                    }
                }
                else if(isFinite(what)){
                    step= step || 1;
                    while(what <n) this[this.length]= what+= step;
                }
                return this;
            }
            

            【讨论】:

              【解决方案9】:
                  getYear(){
                     var currentYear = new Date().getFullYear(),
                     var years = [];
                     var startYear = 1980;
                     for(var i=startYear; i<= currentYear; i++){
                        year.push(startYear++);
                     }
                     return years;
                  }
              

              【讨论】:

              • 什么都没有返回,剩下的大部分已经在问题中了
              猜你喜欢
              • 2015-10-10
              • 2017-12-10
              • 1970-01-01
              • 1970-01-01
              • 2020-08-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多