17

我在 BackboneJS 视图中使用 Underscore 的 template() 方法。我想在我的视图中显示一个字母列表,以便按字母对集合进行排序。

结果,在我看来,我有一个包含 26 个链接的列表(一个链接 = 一个字母)。而不是复制粘贴每个链接(这对代码的可维护性非常不利),我想知道是否可以通过 underscoreJS 循环遍历字母表。

显示结果:

<li ><a href="#">a</a></li>
<li ><a href="#">b</a></li>
<li ><a href="#">c</a></li>
...
<li ><a href="#">z</a></li>
4

9 回答 9

47
var alphabet = "abcdefghijklmnopqrstuvwxyz".split("");
_.each(alphabet, function(letter) {
  console.log(letter);
});

这就是你可以做到的。

于 2013-05-28T09:56:51.547 回答
14
  1. 使用字符代码创建一个范围

    var alphas = _.range(
        'a'.charCodeAt(0),
        'z'.charCodeAt(0)+1
    ); 
    // [97 .. 122]
    
  2. 用字母创建一个数组

    var letters = _.map(alphas, a => String.fromCharCode(a));
    // see @deefour comment
    
    // Non ES6 version
    // var letters = _.map(alphas, function(a) {
    //    return String.fromCharCode(a);
    // });
    
    // [a .. z]
    
  3. 注入您的模板

    var tpl = 
    '<ul>'+
        '<% _.each(letters, function(letter) { %>'+
            '<li><%= letter %></li>'+
        '<% }); %>'+
    '</ul>';
    var compiled = _.template(tpl);
    var html = compiled({letters : letters});
    

还有一个演示http://jsfiddle.net/hPdSQ/17/

var alphas = _.range(
    'a'.charCodeAt(0),
    'z'.charCodeAt(0)+1
); 

var letters = _.map(alphas, a => String.fromCharCode(a));

var tpl = 
'<ul>'+
    '<% _.each(letters, function(letter) { %>'+
        '<li><%= letter %></li>'+
    '<% }); %>'+
'</ul>';
var compiled = _.template(tpl);

var html = compiled({letters : letters});

document.getElementById('res').innerHTML = html;
<script src="http://underscorejs.org/underscore-min.js"></script>
<div id='res'></div>

于 2013-05-28T10:04:01.117 回答
7
for(var letter=65;letter<91;letter++)
{
var _char = String.fromCharCode(letter);
console.log(_char);
}

或使用 97 - 123 ASCII 码作为小写字母

于 2016-01-14T03:35:55.937 回答
4

for (var i = 'a'.charCodeAt(0); i <= 'z'.charCodeAt(0); i++) {
  console.log(String.fromCharCode(i));
}

于 2018-01-13T17:38:34.153 回答
3

使用 ES6 for-of

for(let char of "abcdefghijklmnopqrstuvwxyz" )
  console.log(char); // prints 'a' to 'z'
   

在模板中使用它非常容易,您可以使用Babel将其转换为不支持该语法的浏览器的代码。

于 2016-06-04T15:34:44.180 回答
1

下划线(或 loadash)的另一种方法:

_.map(_.range(26), function(i) { return String.fromCharCode(97 + i) });

// returns ['a', 'b', ..., 'z']
于 2019-05-31T18:50:49.077 回答
0

结合使用underscore.jsandjQuery将帮助您实现这一点(underscore.js 本身无法进行 DOM 插入/操作)。

var abc = ['a', 'b', 'c', 'd']; //i disregarded how you get the list of letters.

_.each(abc, function(letter){
    $('ul').append('<li><a href="#">'+letter+'</a></li>');
});

为你做了一把小提琴

于 2013-05-28T09:58:53.317 回答
0

Underscore 没有这样的能力,但你的案例可以在模板上做一些技巧。像这样更改您的模板:

<% for(var i=65; i<90; i++) { %>
<li ><a href="#"><% print(String.fromCharCode(i)); %></a></li>
<% } %>

这应该是你想要的。

于 2013-05-28T10:00:26.107 回答
0

这是@Medo Medo 的纯 JS 代码的改进* 版本:

    var letters=[], letter_first = 'a', letter_last = 'z' // you can also use A and Z
    for (var letter=letter_first.charCodeAt(0);letter<=letter_last.charCodeAt(0);letter++)
      letters.push(String.fromCharCode(letter))
    document.write(letters.join(''))

  • 修复了“var”声明
  • 添加了直接字母检测
  • 将结果收集到一个数组中,以便只有一个输出
  • 使代码在此处可运行
于 2017-03-10T12:08:01.167 回答