+ -
当前位置:首页 → 问答吧 → 请教一个JS数据分组的问题

请教一个JS数据分组的问题

时间:2010-05-10

来源:互联网

假如输出15个<p></p>

要求按照前两个填充为<p>a</p>,后三个填充为<p>b</p>
依次循环,最后打印出这样的数据,请问怎么实现
引用:
<p>a</p>
<p>a</p>
<p>b</p>
<p>b</p>
<p>b</p>
<p>a</p>
<p>a</p>
<p>b</p>
<p>b</p>
<p>b</p>
<p>a</p>
<p>a</p>
<p>b</p>
<p>b</p>
<p>b</p>

作者: feigege   发布时间: 2010-05-10


<script type="text/javascript"> var line = 15; //输出总数 var n=3; //循环次数 for(var i=0;i<n;i++) { var n_a = 2; for(var a=0; a<n_a; a++) document.write("<p>a</p>"); for(var b=0; b<(line/n)-n_a; b++) document.write("<p>b</p>"); } </script>
 提示:您可以先修改部分代码再运行
[ 本帖最后由 afc163 于 2010-5-10 19:08 编辑 ]

作者: afc163   发布时间: 2010-05-10

刚才用PHP模拟了一个,JS方法就不帖了,原理一样的。不知道大家有没有更好的方法,欢迎交流。
复制内容到剪贴板
代码:
<?php
$num = '';
for($i=0; $i<= 2; $i++)
{
    for($j=1; $j<=5; $j++)
    {
        $num .= $j > 2 ? '2' : '1';
    }
}
echo $num;
?>

作者: feigege   发布时间: 2010-05-10

引用:
原帖由 afc163 于 2010-5-10 19:03 发表
[html]
var line = 15; //输出总数
var n=3;       //循环次数
for(var i=0;i
谢谢你,我没测试你的方法,我刚才帖的方法好像比你少一个循环。

作者: feigege   发布时间: 2010-05-10

一个循环,一个问号表达式,搞定.

js版
<script type="text/javascript"> var line = 15,//输出总数 m = 5, n = 2; /* m 为a,b两个交叉的总个数(两个a,三个b) n 为a的输出个数(n不能大于等于m) */ for(var i=0; i<line; i++){ document.write('<div>'+ ((i%m<n)?'a':'b') +'</div>'); } </script>
 提示:您可以先修改部分代码再运行
PHP版
复制内容到剪贴板
代码:
<?php
$line = 15; //输出总数
$m = 5;     //m 为a,b两个交叉的总个数(两个a,三个b)
$n = 2;     //n 为a的输出个数(n不能大于等于m)
for($i=0; $i<$line; $i++){
  echo '<div>',(($i%$m<$n)?'a':'b'),'</div>';
}
?>
[ 本帖最后由 faeng220 于 2010-5-10 20:41 编辑 ]

作者: faeng220   发布时间: 2010-05-10

引用:
原帖由 faeng220 于 2010-5-10 20:38 发表
一个循环,一个问号表达式,搞定.

js版
[html]

var line = 15,//输出总数
    m = 5, n = 2;
    /*
      m 为a,b两个交叉的总个数(两个a,三个b)
      n 为a的输出个数(n不能大于等于m)
    */

for(v ...
谢谢,长见识了。

作者: feigege   发布时间: 2010-05-10

...菜鸟们~~~用循环也太没意思了~~~
<script type="text/javascript"> alert(new Array(16).join(" ").replace(/ /g, function(a,b){ return "<p>"+(b%5<2?"a":"b")+"</p>\r\n"; })); </script>
 提示:您可以先修改部分代码再运行

作者: hutia   发布时间: 2010-05-11

我也觉得应该用正则是最佳的办法

作者: hero777   发布时间: 2010-05-11

引用:
原帖由 hutia 于 2010-5-11 02:07 发表
...菜鸟们~~~用循环也太没意思了~~~

[html]

alert(new Array(16).join(" ").replace(/ /g, function(a,b){ return ""+(b%5
这个写法太深奥了,真没看懂

作者: feigege   发布时间: 2010-05-11

那么给个浅显的、语义比较好理解的例子
<script type="text/javascript"> String.prototype.dulp=function(n){return new Array(n+1).join(this);} String.prototype.concat=function(s){return this+s;} alert("<p>a</p>\r\n".dulp(2).concat("<p>b</p>\r\n".dulp(3)).dulp(5)); </script>
 提示:您可以先修改部分代码再运行

作者: hutia   发布时间: 2010-05-11

大侠对这些小问题总是一带而过的,让我来多此一举
new Array(16).join(" "); // 15个连续的空格,换什么都可以
后面就是 replace 的用法了,参数用函数名,大侠直接用了匿名函数
replace(/ /g, function(a,b){ ... }) // a——捕获,b——索引
把前面 15个连续的空格 进行全局替换,每捕获一次空格都叫个后面的函数处理
b%5<2 // 取余就很简单了

[ 本帖最后由 askok 于 2010-5-11 14:36 编辑 ]

作者: askok   发布时间: 2010-05-11

引用:
原帖由 askok 于 2010-5-11 14:27 发表
大侠对这些小问题总是一带而过的,让我来多此一举
new Array(16).join(" "); // 15个连续的空格,换什么都可以
后面就是 replace 的用法了,参数用函数名,大侠直接用了匿名函数
replace(/ /g, function(a,b){ .. ...
谢谢,我明白了。

作者: feigege   发布时间: 2010-05-11