js练习1 --- 函数、数组

目录

index.html

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title></title>
  <script src="./problem.js"></script>
</head>
<body></body>
</html>

第一题

题目:实现函数的重载。以Array数据类型的splice函数为例,用arguments数组来实现删除,插入和替换三个功能。(不能直接使用splice函数)。

problem.js

let arr = [2,4,6,7,22,14,17,9,1,3];

function splice_customize() {
  let args = Array.prototype.slice.apply(arguments); //将args转为真正的数组
  if(args.length <= 0) {
    console.log("至少要有一个参数!");
    return;
  }
  let index = args[0];
  switch(args.length) {
    //一个参数,就是从数组下标index开始后面元素全删
    case 1:
      arr = arr.slice(0,index);
      break;
    //两个参数,第一个参数指定数组下标index,第二个参数指定要删多少个元素
    case 2:
      let num = args[1];
      if(index+num > arr.length) {
        console.log("无法删这么多元素!");
      }else {
        arr = [...arr.slice(0,index),...arr.slice(index+num,arr.length)];
      }
      break;
    //三个参数,第一个参数指定数组下标index,第二个参数指定要删多少个元素,第三个元素指定要插入的元素
    default:
      let num2 = args[1];
      let elements = args.slice(2,args.length);
      if(num2 == 0) {
        //插入元素
        arr = [...arr.slice(0,index),...elements,...arr.slice(index,arr.length)];
      }else if(num2 > 0) {
        //替换元素
        if(index+elements.length > arr.length) {
          console.log("无法替换这么多元素!")
        } else {
          arr = [...arr.slice(0,index),...elements,...arr.slice(index+elements.length,arr.length)];
        }  
      }else {
        console.log("第二个参数不能为负数!")
      }
  }
}

//测试
splice_customize();
splice_customize(8);
console.log("从数组下标8开始往后全部删除后:"+arr);
splice_customize(1,20);
splice_customize(5,2);
console.log("从数组下标2开始往后删2个元素:"+arr);
splice_customize(3,0,88,88,88);
console.log("从数组下标3开始往后插入3个元素:"+arr);
splice_customize(4,2,99,99);
console.log("从数组下标4开始往后替换2个元素:"+arr);
splice_customize(1,-1,5);
splice_customize(6,5,5,5,5,5,5);

第二题

题目:使用迭代方法替代for循环。假设数组[4,6,12,8,10],设定相应的条件(2的幂指数),实现every, some, filter和map四种迭代方法。(map:每个元素增加10%)

problem.js

let arr = [4,6,12,8,10];

//every的实现
let isEvery = arr.every(item => {
  return item > 0 && ((item & (item-1)) == 0); //(item & (item-1)) == 0用于判断该元素是不是2的N次方
});
if(isEvery) {
  console.log('数组里面的元素都是2的幂指数');
} else {
  console.log('数组里面的元素不都是2的幂指数');
}

//some的实现
let isSome = arr.some(item => {
  return item > 0 && ((item & (item-1)) == 0);
});
if(isSome) {
  console.log('数组里面的元素存在2的幂指数');
} else {
  console.log('数组里面的元素不存在2的幂指数');
}

//filter的实现
let newArr = arr.filter(item => {
  return item > 0 && ((item & (item-1)) == 0); 
})
console.log(newArr); //将是2的幂指数的元素筛选出来并打印

//map的实现
let newArr2 = arr.map(item => {
  return Math.round(item*1.1*100)/100; //每个元素增加10%,并保留两位小数
})
console.log(newArr2); 

题目:编写noRepeat()函数,删除数组中重复元素,将剩余元素升序排列后,返回新的数组。

problem.js

let arr = [2,3,5,5,8,8,24,17,9,3,9];

//去重并排序
function noRepeat(array) {
  const set = new Set(array);
  return [...set].sort((a,b)=>{
    return a-b;
  });
}
console.log(noRepeat(arr))

题目:利用两个栈模拟实现一个队列。 

problem.js 

 //用两个栈模拟实现一个队列
function Queue() {
  let stack1 = [], stack2 = [];
  //元素入队,这里实际上是元素压入栈1
  this.push = function(element){
    stack1.push(element);
  }
  //元素出队,这里实际上是栈1元素全部出栈,依次压入栈2,然后栈2栈顶弹出一个元素
  this.pop = function(){
    if(stack1.length == 0) return;
    while(stack1.length !== 0){
      stack2.push(stack1.pop());
    }
    let elem = stack2.pop();
    //元素出队之后,再把元素从栈2压回栈1
    while(stack2.length !== 0){
      stack1.push(stack2.pop());
    }
    return elem;
  }
  // 检查队列是否为空
  this.isEmpty = function () {
    return stack1.length == 0
  }
  // 返回队列的长度
  this.size = function () {
    return stack1.length;
  }
}
//测试
let queue = new Queue();
queue.push(2);
queue.push(3);
console.log('出队元素:' + queue.pop());
console.log('队列长度:' + queue.size());
queue.push(4);
queue.pop();
console.log('出队元素:' + queue.pop());
console.log('队列长度:' + queue.size()); 
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漂流の少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值