数组练习题
1.用js实现随机选取10~100之间的10个数字,存入一个数组,并排序
//要是获取不重复的,则对随机数再进行去重。
function arrRandom() {
var arr = [];
for (var i = 0; i < 10; i++) {
var num = getRandomNum(10, 100);
arr.push(num);
}
return arr.sort(function (a, b) {
return a - b;
});
}console.log(arrRandom());
//2.获取范围内的随机数
function getRandomNum(startNum, endNum) {
if (startNum <= endNum) {
return parseInt(Math.random() * (endNum - startNum + 1) + startNum);
}
else {
return parseInt(Math.random() * (startNum - endNum + 1) + endNum);
}
}
2.编写尽可能简洁的javascript代码,找到在第一个数组array1中出现,而在第二个数组array2中没有出现的数字。
indexof()判断数字是否出现,join()用于把数组中的所有元素连接成一个字符串,元素是通过指定的分隔符进行分隔的。
//方法1--注意这种方法只能对比数字。
// 并且有个bug,要是数组一中第一个元素是1,数组二中最后一个元素尾数也是1,则认为数组一中的第一个元素和数组二中的最后一个元素相同。
function findNullOfArr(arrOne, arrTwo) {
var str = arrTwo.join("");
var result = [];
for (var i = 0; i < arrOne.length; i++) {
// 看到这里有个小点就是 indexOf 会做简单的类型转换,把数字转换成字符串 '2' 然后再执行。
if (str.indexOf(arrOne[i]) == -1) {
result.push(arrOne[i]);
console.log(typeof arrOne[i]);
}
}
return result;
}
var arr1 = [1, 22, 3, 44, 5, 6, 7];
var arr2 = [2, 3, 441];
var b = [findNullOfArr(arr1, arr2)];
console.log(b);
// 方法2--找到在第一个数组array1中出现,而在第二个数组array2中没有出现的数字。
function duplicates(arrOne, arrTwo) {
var final = [];
var result = [];
//数组一和数组二中都有的元素放进final。
for (var i = 0; i < arrOne.length; i++) {
for (var j = 0; j < arrTwo.length; j++) {
if (arrOne[i] == arrTwo[j] && final.indexOf(arrOne[i]) == -1) {
final.push(arrOne[i]);
}
}
}
//数组一和final比较,final没有的就放进去。
for (var i = 0; i < arrOne.length; i++) {
if (final.indexOf(arrOne[i]) == -1) {
result.push(arrOne[i]);
}
}
return result;
}
var arr1 = [2, 2, 3, 4, 5, 5, 7, "a"];
var arr2 = [8, 2, 3, 4, 5, 5];
console.log(duplicates(arr1, arr2));
3.数组去重。
var arrNum = [1,4,1,1,3,3,4,6,7,8,3,7,0,11,22,22];
方法1.遍历数组法
最简单的去重方法,实现思路:新建一新数组,遍历传入数组,值不在新数组就加入该新数组中;注意点:判断值是否在数组的方法“indexOf”是ECMAScript5 方法,IE8以下不支持,需多写一些兼容低版本浏览器代码,源码如下:
function arrNoRepeat(arr) {
var newArr = [];
for (var i = 0; i < arr.length; i++) {
if (newArr.indexOf(arr[i]) == -1) {
newArr.push(arr[i]);
}
}
return newArr;
}
var arr = [2, 2, 1, 4, 5, 4];
console.log(deleteRepeat(arr));
方法2.优化遍历数组法
该方法的实现代码相当酷炫,实现思路:获取没重复的最右一值放入新数组。(检测到有重复值时终止当前循环同时进入顶 层循环的下一轮判断)推荐
// 思路:获取没重复的最右一值放入新数组
var arr = [1, 3, 5, 7, 9, 1, 3, 5];
function unique5(array) {
var r = [];
for (var i = 0, l = array.length; i < l; i++) {
for (var j = i + 1; j < l; j++)
if (array[i] === array[j]) j = ++i;
r.push(array[i]);
}
return r;
}
console.log(unique5(arr));
4.现有一个数组(元素为数字,并且有可能重复),请给Array.prototype增加一个方法(方法名自取),该方法能去掉数组中全部最大和最小的数字。
数组最大值
Array.prototype.max = function(){ return Math.max.apply(null,this);}
数组最小值
Array.prototype.min = function(){ return Math.min.apply(null,this);}
5.给定一个数组实现字符串反转,要求原地实现。
使用循环数组的方法:
var arr = new Array();
function myreverse(arr){
for(var i =0;i < arr.length/2;i ++){
var temp = arr[i];//交换变量
arr[i] = arr[arr.length - i - 1];
arr[arr.length - i - 1] = temp;
}}
6.如何准确判断一个javascript对象是数组?
标准方法:
if(object.prototype.toString.call(a) == '[object Array]'){ //是数组对象}
常用方法:
if(a.constructor == Array){ //是数组对象}
7.写出一个javascript的函数,实现对一个数组去重的功能。
构建一个新的数组存放结果。
for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比。
若结果数组中没有该元素,则存到结果数组中。
Array.prototype.unique1 = function(){
var res = [this[0]];
for(var i =1;i < this.length;i ++){
var repeat = false;
for(var j = 0;j < res.length;j ++){
if(this[i] == res[j]){
repeat = true;
break;
} }
if(!repeat){
res.push(this[i]);
} }
return res;}
var b = arr.unique1()
alert(b);
8.请写出一个函数,功能是删除数组的指定下标元素。
array.pop();//删除最后一个元素,并返回该元素.
array.shift();//删除第一个元素,数组元素位置自动前移,返回被删除的元素
array.splice(start,delCount);//从start的位置开始向后删除delCount个元素
// 3.请写出一个函数,功能是删除数组的指定下标元素。
function deleteNumArr(arr, index) {
if (isNaN(index) || index > arr.length - 1) {
return false;
}
else {
arr.splice(index, 1);
return arr;
}
}
var arr = [2, 3, 4, 5, 6];
alert(deleteNumArr(arr, 1));
9.请写一个函数removeVoid(arr),删除该数组中值为“null,undefined”的项,返回原数组。
function removeVoid(arr) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] == "" || arr[i] == "undefined" || !arr[i]) {//!arr[i])过滤不是数组的元素,比如null(空值)。
arr.splice(i, 1);
}
}
return arr;
}
var arr = [, 1, undefined, 2, null, 5];
alert(removeVoid(arr));
10.数组去重,给Array本地对象增加一个原型方法。
Array.prototype.delrepeat = function(){
var arr = this;
var _arr = new Array();
for(var i in arr){
if(i == 'delrepeat') continue;
if(_arr.length == 0) _arr.push(arr[i]);
for(var j = 0;j _arr.length - 2) _arr.push(arr[i]);
}
return _arr;
}
11.用js实现随机选取10~100之间的10个数字,存入一个数组,并排序。
function getRandom(istart,iend){//列出需要被选中的数据
var a1 = [];
for(var i = 0;i < 91;i ++){
a1[i] = i + 10; }
//挑选出随机数据
var a2 = [];
for(var j = 0;j < 10;j ++){
a2.push(a1.splice(Math.floor(Math.random()*a1.length),1));
a2.sort();
alert(a2);}
getRandom(10,100);
12.把两个数组合并,并删除第二个元素。
var array1 = ['a','b','c'];
var array2 = ['d','e','f'];
var array3 = array1.concat(array2);
array3.splice(1,1);
13.根据每个元素的i属性,由小到大排序如下数组。
var arr=[{i:5,v:1},{i:2,v:4},{i:3,v:2},{i:1,v:5},{i:4,v:3}];
解析:
arr.sort(function(a,b){ return a.i-b.i; })
对于一个数组,sort()默认按字符编码排序:
var testArray=[3,324,5345,6546,134,5654,665];testArray.sort();alert(testArray);
输出结果是:134 3 324 5345 5654 6546 665
现在要让它按照数值大小排序:
var testArray=[3,324,5345,6546,134,5654,665];testArray.sort(function(a,b){return a-b;});alert(testArray);
这里传递一个比较函数给sort,比较函数的逻辑是:如果两参数的差值小于0,则表示a必须出现在b前面,否则在b后面。
输出结果是:3 134 324 665 5345 5654 6546
1. 读取学生的10门课的成绩, 然后输出10门课成绩的最高分, 最低分, 总分, 平均分.
提示:把10门课的成绩保存如一个数组中.
<!DOCTYPE html>
<!--题目:读取学生的10门课的成绩, 然后输出10门课成绩的最高分, 最低分, 总分, 平均分.
提示:把10门课的成绩保存如一个数组中.-->
varsum =0;
varave =0;
vararr = [90,100,10,20,30,40,50,60,70,80];
console.log(arr);
//排序
arr.sort(function(a, b){
returna - b;
});
//最高分
functionlarge(arr){
returnarr[arr.length -1];
};
//最低分
functionsmall(arr){
returnarr[0];
};
//总分
functiontotal(arr){
for(vareleofarr) {
sum += ele;
}
returnsum;
};
//平均分
functionave(arr){
returnsum / arr.length;
}
//输出
console.log("总分: "+ total(arr));
console.log("最高分: "+ large(arr));
console.log("最低分: "+ small(arr));
console.log("平均分: "+ ave(arr));
<!--记得再次用原型替换3进行调试-->
用函数封装起来:(更具面向对象的思想)
<!DOCTYPE html>
Title
functionStudent(){
this.scores = [];
this.init =function(){
for(vari =0; i <3; i++){
varscore = +prompt("请输入学生的成绩:");
this.scores.push(score);
}
};
this.max =function(){
varscores =this.scores;
varm = scores[0];// ["100", "200", "40"]
for(vari =1; i < scores.length; i++){
if(m < scores[i]){
m = scores[i];
}
}
returnm;
}
this.min =function(){
varscores =this.scores;
varm = scores[0];// ["100", "200", "40"]
for(vari =1; i < scores.length; i++){
if(m > scores[i]){
m = scores[i];
}
}
returnm;
}
this.sum =function(){
vars =0;
for(vareofthis.scores){
s += e;
}
returns;
}
this.avg =function(){
returnthis.sum() /this.scores.length;
}
}
vars1 =newStudent();
s1.init();//初始化学生的成绩
console.log(s1.max());
2. 创建100个随机的10到60的随机整数, 然后分别统计每个数字出现的次数
<!DOCTYPE html>
Title
<!--创建100个随机的10到60的随机整数, 然后分别统计每个数字出现的次数-->
//arr是放随机数产生的数字,newArr是放重复元素和重复个数的二维数组
vararr = [];
varnewArr = [];
//js的数组可以动态增加,使用数组字面量创建
for(vari =0; i <100; i++) {
//用random判断随机数其实不是perfect(正态分布)
arr[i] =parseInt(Math.random() *50+10);
}
console.log("随机数(正态分布):\n"+ arr);
//对数组进行排序
arr.sort(function(a, b){
returna - b;//升序
});
console.log("随机升序排序:\n"+ arr);
//判断数组元素的重复个数,这样算法是相对而言比较高效的,省掉了低效的代码率
for(vari =0; i < arr.length;) {
varcount =0;
for(varj = i; j < arr.length; j++) {
if(arr[i] == arr[j]) {
count++;
}else{
break;
}
}
newArr.push([arr[i], count]);
i += count;
}
//输出二维数组
for(vari =0; i < newArr.length; i++) {
console.log(newArr[i][0] +"重复次数:"+ newArr[i][1]);
}
在这顺便讲解一下随机数生成的方法,以后只要涉及到随机数,就套路进去就行,就跟数学公式一样。(证明略)
如何使用js生成n到m间的随机数字,主要目的是为后期的js生成验证码做准备。
方法1:Math.random()函数返回0和1之间的伪随机数,可能为0,但总是小于1,[0,1)
生成n-m,包含n但不包含m的整数:
Step1:算出 m-n的值,假设等于w
Step2:Math.random()*w
Step3:Math.random()*w+n
Step4:parseInt(Math.random()*w+n, 10) 在这里10表示10进制,默认就是10进制。
方法2:生成n-m,不包含n但包含m的整数:
Step1:算出 m-n的值,假设等于w
Step2:Math.random()*w
Step3:Math.random()*w+n
Step4:Math.floor(Math.random()*w+n) + 1
注:Math.floor() 返回小于等于数字参数的最大整数,对数字进行下舍入
一般记住这两种方法就行了。
另解:(在那里要不要加1,看自己的情况,掌握怎么算的):
<!DOCTYPE html>
Title
// [0, 1) [0, 51) [10, 61) [10, 60]
// m = 10 n= 60
functionrandomInt(m, n){//区间: [m, n]
returnparseInt(Math.random() * (n - m +1) + m);
}
/*创建一个长度是 count, 元素的值的范围 是 [m, n]的数组*/
functioncreateArray(count, m, n){
vararr = [];
for(vari =0; i < count; i++){
arr.push(randomInt(m, n));
}
returnarr;
}
functiontongji(){
varobj = {};
vararr = createArray(400,10,19);
for(varnum =10; num <=19; num++){
varc =0;
for(vareofarr){
if(e == num){
c++;
}
}
obj[num +""] = c;
}
returnobj;
}
varresult = tongji();
console.log(10+"的个数:"+ result["10"]);
console.log(result["11"]);
console.log(result);
3. 定义一个函数, 判断数组中是否所有的数字都大于0
提示: 传入一个数组, 返回布尔值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<!--定义一个函数, 判断数组中是否所有的数字都大于0
提示: 传入一个数组, 返回布尔值
-->
<body>
<script>
var arr=[10,20,3,1,3.1,9,1,34,90,0,-100,100];
var flag=true;
for(var i=0;i<arr.length;i++){
if(arr[i]<0){
flag=false;
console.log("数组存在第一个非正值为:"+arr[i]+" 其数组下标为 "+i);
break;
}
}
if(flag){
console.log("数组恒正~");
}else{
console.log("因此,数组不是恒正的~");
}
</script>
</body>
</html>
4. 封装函数: 把两个数组共同的元素放入一个新的数组, 并返回新的数组
提示: 传入两个数组, 返回值为新的数组
<!DOCTYPE html>
Title
<!--封装函数: 把两个数组共同的元素放入一个新的数组, 并返回新的数组
提示: 传入两个数组, 返回值为新的数组
-->
vararr1 = [1,2,3,"aaa","hello",999,-1];
vararr2 = [3,78,"aaa","bbb",99,1,-1,"hello"];
varnewArr = [];
//两层嵌套,效率很低。
functioncommon(arr1, arr2){
for(vari =0; i < arr1.length; i++) {
for(varj =0; j < arr2.length; j++) {
if(arr1[i] === arr2[j]) {
newArr.push(arr1[i]);
}
}
}
}
common(arr1, arr2);
console.log(newArr);
5. 定义一个函数: 可以把数组中的下标为 3 的元素移到数组的开头.
提示: 传入一个数组
<!DOCTYPE html>
Title
<!--定义一个函数: 可以把数组中的下标为 3 的元素移到数组的开头.
提示: 传入一个数组
-->
vararr = [1,2,3,4,5,6,7,8,9,111];
console.log("原数组: "+ arr);
//函数alter将下标为3的移动到开头
functionalter(arr){
vartemp = arr[3];
arr.splice(3,1);
arr.splice(0,0, temp);
}
alter(arr);
console.log("移动后数组: "+ arr);
6. 有一个从大到小排好序的数组{99,85,82,63,60}。
现从页面输入一个数,要求按原来的规律将它插入数组中。
假设你输入的80,则应该插入到82和63之间。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<!--题目:有一个从大到小排好序的数组{99,85,82,63,60}。
现从页面输入一个数,要求按原来的规律将它插入数组中。
假设你输入的80,则应该插入到82和63之间。
-->
<!--
此题方法集锦:
法1:投机取巧 直接先把数字插入到数组头部或者尾部,然后一块排序,很ok吧。
法2:用折半查找二分法,在大样本数据下比较高效,本题解法实则时间复杂度达到O(n),而折半O(log2n)
-->
<body>
<script>
//需插入的数字
var insertNum=16;
//假设未排序,自己先排序一下
var arr=[88,98,2,5,8,10,25,36];
arr.sort(function (a,b) {
return b-a; //降序排列
});
console.log("降序排列的数组为:"+arr);
// 此循环得到的i值就是排序好的数组最接近insertNum值得那个最大下标,虽然效率很差。
for(var i=0;i<arr.length;i++){
if(arr[i]>=insertNum){
var temp=i;
}
}
//插入到下标为temp+1的位置
arr.splice(temp+1,0,insertNum);
//输出info
console.log("插入数字"+insertNum+"后的新数组为: "+arr);
</script>
</body>
</html>
另解:
<script>
/*7. 有一个从大到小排好序的数组{99,85,82,63,60}。
现从页面输入一个数,要求按原来的规律将它插入数组中。
假设你输入的80,则应该插入到82和63之间。*/
functioninsert(arr, num){
for(vari =0; i < arr.length; i++){
if(arr[i] < num){
arr.splice(i,0, num);
return;// 直接结束函数
}
}
arr.push(num);
}
vararr = [99,85,82,63,60];
insert(arr,610);
console.log(arr);
7. 一个数字中有20个元素,对前10个元素使用升序,后10个元素使用降序。
元素都是整数。
<!DOCTYPE html>
Title
//数组元素20个
vararr = [100,12,34,67,23,16,6,9,24,79,2,90,33,69,1,34,-2,0,666,1000];
//切片
vararr1=arr.slice(0,10);
vararr2=arr.slice(10);
//前升序
arr1.sort(function(a,b){
returna-b;
});
//后降序
arr2.sort(function(a,b){
returnb-a;
});
//组合新数组(cs6)并输出
varnewArr = [...arr1,...arr2];
console.log("前升序后降序的数组为: "+ newArr);