关于JS的问题(设计二维数组)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于JS的问题(设计二维数组)相关的知识,希望对你有一定的参考价值。

编程练习
在一个大学的编程选修课班里,我们得到了一组参加该班级的学生数据,分别是姓名、性别、年龄和年级,接下来呢,我们要利用javascript的知识挑出其中所有是大一的女生的的名字哦。
学生信息如下:
('小A','女',21,'大一'), ('小B','男',23,'大三'),
('小C','男',24,'大四'), ('小D','女',21,'大一'),
('小E','女',22,'大四'), ('小F','男',21,'大一'),
('小G','女',22,'大二'), ('小H','女',20,'大三'),
('小I','女',20,'大一'), ('小J','男',20,'大三')
=================
提示及要求
第一步: 把这些数据组成一个数组,方便我们之后操作哦。
提示: 使用二维数组。
第二步: 筛选数据吧,首先找出都是大一的所有信息 ;
第三步: 最后再一次筛选上一步得到的数据,打印出都是女生的姓名 ;
提示: 可以用switch 或 if 语句进行筛选。
===================
<script type="text/javascript">

//第一步把之前的数据写成一个数组的形式,定义变量为 infos
var myarr = [['小A','女',21,'大一'],['小B','男',23,'大三'],['小C','男',24,'大四'],['小D','女',21,'大一'],['小E','女',22,'大四'],['小F','男',21,'大一'],['小G','女',22,'大二'],['小H','女',20,'大三'],['小I','女',20,'大一'],['小J','男',20,'大三']]
//第一次筛选,找出都是大一的信息
firarry = new Array();
for(var i=0;i<10;++i)
if(myarr[i][3]=='大一')
firarry = myarr[i]
document.write(firarry);


//第二次筛选,找出都是女生的信息
for(var j=0;j<4;++j)
if(firarry[j][1]=='女')
document.write(firarry[j][0]);

</script>
请问哪里错了?

<script type="text/javascript">
//你的代码
var myarr = [['小A','女',21,'大一'],['小B','男',23,'大三'],['小C','男',24,'大四'],['小D','女',21,'大一'],
['小E','女',22,'大四'],['小F','男',21,'大一'],['小G','女',22,'大二'],['小H','女',20,'大三'],
['小I','女',20,'大一'],['小J','男',20,'大三']]
var firarry = new Array();
for(var i=0;i<10;++i) //这句不对,i=0,++1,那么下面这行的i就是1了
if(myarr[i][3]=='大一')
firarry = myarr[i];
//document.write(firarry);//这行输出大一的,没有用


for(var j=0;j<4;++j) //因为上面的被覆盖了,所以这是最后一个大一的,再遍历也只有一个人,
// 而且控制条件写的不对,怎么可以小于4呢,里面只有一个人呀!
if(firarry[j][1]=='女')
document.write(firarry[j][0]);

/* 这里附上我写的一个运行成功的代码
var myarr=[['小A','女',21,'大一'],['小B','男',22,'大三'],['小c','男',15,'女'],['小D','女',14,'大一']];
for(var i=0;i<myarr.length;i++)
if(myarr[i][3]=='大一'&&myarr[i][1]=='女')
document.write(myarr[i]);


*/
</script>
参考技术A

直接给你代码,对你的代码微略的做了修改。你对照看,就知道你的错误了!

 var myarr = [['小A','女',21,'大一'],['小B','男',23,'大三'],['小C','男',24,'大四'],['小D','女',21,'大一'],['小E','女',22,'大四'],['小F','男',21,'大一'],['小G','女',22,'大二'],['小H','女',20,'大三'],['小I','女',20,'大一'],['小J','男',20,'大三']];
  //第一次遍历
  var dayi=[];//声明一个数组,用于存放大一学生
  for(var i=0;i<myarr.length;i++)
    if(myarr[i][3]=="大一")
      //将大一学生加入到一个新的数组中
      dayi.push(myarr[i]);
      console.log(myarr[i]);
    
  
//找出都是女生的信息,遍历新的数组
for(var j=0;j<dayi.length;j++)
    if(dayi[j][1]=='女')
    document.write("姓名:"+dayi[j][0]+" 年龄:"+dayi[j][2]+"\\r\\n");
    

追问

我想知道为什么要用.push,直接赋值不可以吗?

追答

在循环中直接复制,是对这个数组值一次一次的被覆盖,而不追加所有元素都数组中。你那样直接赋值,最后数组只是最后一个大一学生的数组,而不是全部的大一学生的元素。你试试就知道了。用push是添加值。不过你可以用另一种方式 dayi[length]=[];

本回答被提问者采纳
参考技术B 把筛选到的数据插入新数组的时候有问题
firarray.push(myarr[i]); // 这样才是正确的数组添加元素的方法追问

可是我问别人,有的人说JS数组可以直接赋值啊,就像这样:firarray=myarr[i]; 你看我在控制台的演示,这样是完全可以的啊?


能再给解释解释吗?谢谢啊

请教一个关于二维数组的算法

在下面这样一个6×9二维数组中,需要找出满足1,1,4,1,1这样排列的组合来,记录它们的坐标。

int Array[6][9] =

1,1,0,1,0,0,1,0,0,
4,1,1,0,0,0,1,4,0,
4,0,0,1,1,4,4,1,0,
0,0,0,0,0,1,0,1,0,
0,0,1,1,4,1,0,1,0,
0,0,0,0,4,0,0,0,0,
;

算法越简单越好,能有具体代码更好,我会追加积分的,多谢各位~~
谢谢各位,忘记说清楚了,需要这5个数相连,顺序满足1,1,4,1,1,只能横竖相连,不能斜线相连,

如果仅仅对于6×9这么小的矩阵来说,可以直接循环寻找各个方向的匹配,源代码如下:

#include <cstdio>
#include <cstring>
using namespace std;

int Array[6][9] =

1,1,0,1,0,0,1,0,0,
4,1,1,0,0,0,1,4,0,
4,0,0,1,1,4,4,1,0,
0,0,0,0,0,1,0,1,0,
0,0,1,1,4,1,0,1,0,
0,0,0,0,4,0,0,0,0,
;

int mo[5] = 1,1,4,1,1;

bool check_right(int a,int b) //右方向

int i;
for (i=0;i<5;i++) if (b + i >= 9) return false;
else if (Array[a][b + i] != mo[i]) return false;
return true;


bool check_down(int a,int b) //下方向

int i;
for (i=0;i<5;i++) if (a + i >= 6) return false;
else if (Array[a + i][b] != mo[i]) return false;
return true;


bool check_left_down(int a,int b) //左下方向

int i;
for (i=0;i<5;i++) if (a + i >= 6 || b - i < 0) return false;
else if (Array[a + i][b - i] != mo[i]) return false;
return true;


bool check_right_down(int a,int b) //右下方向

int i;
for (i=0;i<5;i++) if (a + i >= 6 || b + i >= 9) return false;
else if (Array[a + i][b + i] != mo[i]) return false;
return true;


int main()

int i,j;
for (i=0;i<6;i++)
for (j=0;j<9;j++)

if (check_right(i,j)) printf("%d %d right\n",i,j);
if (check_down(i,j)) printf("%d %d down\n",i,j);
if (check_left_down(i,j)) printf("%d %d left_down\n",i,j);
if (check_right_down(i,j)) printf("%d %d right_down\n",i,j);
// 由于模板文本具有回文性质,故只需匹配4个方向,若对于任意模板文本,追加检查剩余的四个方向即可.

return 0;


若对于较为巨大的矩阵以及较多的模板文本,(例如500×500的矩阵,500个文本),如果需要在较短的时间内完成算法(如1秒)需要使用后缀自动机,具体到这个问题就是trie图,一种基于后缀有限状态自动机(Suffix DFA)的专门用于处理多串匹配的数据结构,其构造方法大致是先构造模板文本的trie树,再通过后缀链接生成包含所有转移的trie图。参考源代码如下:
(此代码从控制台读入一个最大支持到1000×1000的字符矩阵,以及最多1000个文本,程序向控制台输出每一个文本在矩阵中的起始位置和方向,以A-H表示八个方向,在Intel Pentium D 2.1G的处理器上对于任何数据均可在1s内完成运算)

#include <stdio.h>
#include <string.h>
int n,m,l,totalnode;
#define N 1100
#define M 1100000
char data[N][N];
char word[N];
typedef struct

int suffix,kind;
int c[26];
trieT;
trieT trie[M];
typedef struct

int a,b;
char oper;
ans_type;
ans_type ans[N];
int Q[M];
char nowoper;
const int thitah[8]=1,1,0,-1,-1,-1,0,1;
const int thital[8]=0,-1,-1,-1,0,1,1,1;

void read_data()

scanf("%d %d %d%*c",&n,&m,&l);
int i,j;
for (i=1;i<=n;i++)

for (j=1;j<=m;j++) scanf("%c",&data[i][j]);data[i][j]-='A';
scanf("%*c");


void insert(int s,int len)

int i,pnt=1;
for (i=len-1;i>=0;i--)

if (trie[pnt].c[word[i]]!=0) pnt=trie[pnt].c[word[i]];
else

totalnode++;
trie[pnt].c[word[i]]=totalnode;
pnt=totalnode;
trie[pnt].kind=-1;trie[pnt].suffix=0;
memset(trie[pnt].c,0,sizeof(trie[pnt].c));


trie[pnt].kind=s;

void init()

totalnode=1;
trie[1].kind=-1;trie[1].suffix=1;
memset(trie[1].c,0,sizeof(trie[1].c));
int i,j,len;
for (i=1;i<=l;i++)

scanf("%s",&word);
len=strlen(word);
for (j=0;j<len;j++) word[j]-='A';
insert(i,len);


void make_trie_graph()

int i,temp,tempnode,cl,op;
cl=0;op=0;
for (i=0;i<26;i++) if (trie[1].c[i]!=0)

temp=trie[1].c[i];
trie[temp].suffix=1;
if (trie[temp].kind==-1) trie[temp].kind=trie[1].kind;
Q[++op]=temp;
else trie[1].c[i]=1;
while (cl<op)

tempnode=Q[++cl];
for (i=0;i<26;i++) if (trie[tempnode].c[i]!=0)

temp=trie[tempnode].c[i];
trie[temp].suffix=trie[trie[tempnode].suffix].c[i];
if (trie[temp].kind==-1) trie[temp].kind=trie[trie[temp].suffix].kind;
Q[++op]=temp;
else trie[tempnode].c[i]=trie[trie[tempnode].suffix].c[i];


void get_ans(int s,int h,int l)

while (trie[s].kind!=-1)

ans[trie[s].kind].a=h;ans[trie[s].kind].b=l;
ans[trie[s].kind].oper=nowoper;
s=trie[s].suffix;


void check(int h,int l)

int pnt=1;
while ((h>0) && (h<=n) && (l>0) && (l<=m))

pnt=trie[pnt].c[data[h][l]];
if (trie[pnt].kind!=-1) get_ans(pnt,h,l);
h+=thitah[nowoper];l+=thital[nowoper];


void work_ans()

int i;
nowoper=0;for (i=1;i<=m;i++) check(1,i);
nowoper=1;for (i=1;i<=m;i++) check(1,i);for (i=2;i<=n;i++) check(i,m);
nowoper=2;for (i=1;i<=n;i++) check(i,m);
nowoper=3;for (i=1;i<=n;i++) check(i,m);for (i=1;i<m;i++) check(n,i);
nowoper=4;for (i=1;i<=m;i++) check(n,i);
nowoper=5;for (i=1;i<=m;i++) check(n,i);for (i=1;i<n;i++) check(i,1);
nowoper=6;for (i=1;i<=n;i++) check(i,1);
nowoper=7;for (i=1;i<=n;i++) check(i,1);for (i=2;i<=m;i++) check(1,i);


void show_ans()

int i;
for (i=1;i<=l;i++) printf("%d %d %c\n",ans[i].a-1,ans[i].b-1,ans[i].oper+'A');


int main()

read_data();
init();
make_trie_graph();
work_ans();
show_ans();
return 0;


若楼主希望学习trie图的具体理论和构造方法,可回帖注明。
参考技术A 你的问题,我还是不太明白,我写了一个简单,但只是针对,你上面的那个,没什么扩展性,你先看看,坐标呢,直接打印,没有写入文件..

#include"T1.h"
#include<iostream>
using namespace std;
const void Sevch(int (&Sj)[6][9],int (&key)[5]);
int main(int argc,char* argv[])

int Array[6][9]=

1,1,4,1,1,4,1,1,0,
4,1,1,0,0,0,1,4,0,
4,0,0,1,1,4,4,1,0,
0,0,0,0,0,1,0,1,0,
0,0,1,1,4,1,1,1,0,
0,0,0,0,4,0,0,0,0,
;
int Key[5]=1,1,4,1,1;
Sevch(Array,Key);
cin.get();

const void Sevch(int (&Sj)[6][9],int (&key)[5])

int Len=6;
int Lie=9;
for(int i=0;i<Len;i++)

for(int j=0;j<Lie;j++)

if(Sj[i][j]==key[0]&&Sj[i][j+1]==key[1]&&Sj[i][j+2]==key[2]&&Sj[i][j+3]==key[3]&&Sj[i][j+4]==key[4])

cout<<"Key:"<<"在"<<i+1<<"行"<<j+1<<"列"<<endl;





V1.1增强版.

#include<iostream>
using namespace std;
const void Sevch_R(int (&Sj)[6][9],int (&key)[5]); //水平方向查找.
const void Secvh_X(int (&Sj)[6][9],int (&key)[5]); //垂直方向查找.
int main(int argc,char* argv[])

int Array[6][9]=

1,1,4,1,1,1,4,1,1,
1,1,1,1,1,1,4,1,1,
4,4,4,1,1,4,4,1,1,
1,1,1,4,1,1,0,1,4,
1,1,1,1,4,1,1,1,1,
1,1,4,1,1,1,4,1,1,
;
int Key[5]=1,1,4,1,1;
cout<<"水平方向的Key有:\n";
Sevch_R(Array,Key);
cout<<"\n垂直方向的Key有:\n";
Secvh_X(Array,Key);
cin.get();


const void Sevch_R(int (&Sj)[6][9],int (&key)[5])

for(int i=0;i<6;i++)

for(int j=0;j<5;j++)

if(Sj[i][j]==key[0]&&Sj[i][j+1]==key[1]&&Sj[i][j+2]==key[2]&&Sj[i][j+3]==key[3]&&Sj[i][j+4]==key[4])

cout<<"Key:"<<"在"<<i+1<<"行"<<j+1<<"列"<<endl;





const void Secvh_X(int (&Sj)[6][9],int (&key)[5])

for(int j=0;j<2;j++)

for(int i=0;i<9;i++)

if(Sj[j][i]==key[0]&&Sj[j+1][i]==key[1]&&Sj[j+2][i]==key[2]&&Sj[j+3][i]==key[3]&&Sj[j+4][i]==key[4])

cout<<"Key:"<<"在"<<j+1<<"行"<<i+1<<"列"<<endl;



参考技术B 修改后,横纵方向各扫一遍
#include <iostream>
using namespace std;
int Array[6][9] =

1,1,0,1,0,0,1,0,0,
4,1,1,0,0,0,1,4,0,
4,0,0,1,1,4,4,1,0,
0,0,0,0,0,1,0,1,0,
0,0,1,1,4,1,0,1,0,
0,0,0,0,4,0,0,0,0,
;
int arrayString[]=1,1,4,0,0;
int main(void)

int y=sizeof(*Array)/sizeof(int);
int x=sizeof(Array)/sizeof(int)/y;
int len=sizeof(arrayString)/sizeof(int);
int i,j,k;
for(i=0;i<x;i++)
for(j=0;j<y-len;j++)
for(k=0;k<len;k++)
if(Array[i][j+k]!=arrayString[k])break;

if(k==len)
cout<<"x="<<j+1<<"y="<<i+1<<endl;


for(i=0;i<x-len;i++)
for(j=0;j<y;j++)
for(k=0;k<len;k++)
if(Array[i+k][j]!=arrayString[k])break;

if(k==len)
cout<<"x="<<j+1<<"y="<<i+1<<endl;


return 0;
参考技术C 只要横向的一组数里面是1,1,4,1,1就行吗?

以上是关于关于JS的问题(设计二维数组)的主要内容,如果未能解决你的问题,请参考以下文章

一个关于C语言的指针与二维数组的问题

js里面二维数组如何实现?

关于c语言二维数组列指针初始化

C语言中关于二维数据指针的问题?

关于返回二维数组指针问题

js怎么解析后台传过来的二维数组