JS数组方法重构 练习题 -持续更新

Array.prototype.mypop
let arr = [1,58,99,63,4];
console.log(arr.__proto__);
// 声明一个数组构造函数原型方法cls
Array.prototype.mypop = function(){
  // 数组长度-1实现删除末尾元素
  let at = this[this.length-1]
  if(this.length != 0){
  this.length=this.length-1;
  return at
  }else{
  return undefined
  }
}
console.log(arr,arr.pop())
Array.prototype.mypush
//重构数组push方法 修改原数组返回修改后数组长度
let arr =[23,55,99,2,4];
/* let arr1= arr.push('7');
console.log(arr1,arr)  */
//修改原数组,并返回数组长度
Array.prototype.mypush = function(...arguments){
  for(let i=0;i<arguments.length;i++){
    this[this.length] = arguments[i]
  }
  return this.length
}
console.log(arr,arr.mypush('tom','tea'))
Array.prototype.myshift
var arr = [1, 2, 5, 6, 3, 88]
Array.prototype.myshift = function () {
 
  var first = this[0]
  for (let i = 1; i < this.length; i++) {
    this[i] = this[i + 1]
  }
  this.length--
  return first
}
console.log(arr, arr.myshift())
Array.prototype.myunshift
let arr =[23,55,99,2,4];
Array.prototype.myunshift=function(...arguments){
/*   let arr1 = [];
  let length = arguments.length+this.length
  for(let i =0;i<arguments.length;i++){
    arr1[arr1.length] = arguments[i]; 
  }
  for(let j=0;j<this.length;j++){
    arr1[arr1.length]=this[j]
  } */
  let length = arguments.length+this.length
  for(let i = length-1;i>=0;i--){
  if(i>arguments.length-1){
    this[i] = this[i-arguments.length] 
  }else{
    this[i] = arguments[i]
  }
  }
  return length
}
console.log(arr,arr.myunshift(5,'jerry'))
Array.prototype.myreverse
// reverse()颠倒数组元素顺序
let arr = [85,99,552,4,3]
let rev = arr.reverse()
console.log(arr,rev);
// reverse()返回翻转后的新数组,修改原数组,不参数
Array.prototype.myreverse = function(){
  for(let i = 0;i<=(this.length/2);i--){
    this[i] = this[this.length-1-i]
  }
  return this
}
console.log(arr,arr.myreverse());
Array.prototype.myforEach
// 迭代方法重构
// forEach
let arr = [1, 2, 3, 4, 5, 6];
/* arr.forEach(function(item,index,obj){
  console.log(item);
  console.log(index);
  console.log(obj);//arr
  // console.log(arr);
})  */

Array.prototype.myforEach = function (callback) {
  for (var i = 0; i < arr.length; i++) {
    callback(arr[i], i, arr)
  }
}
arr.myforEach(function (item, index, arr) {
  console.log(item, index, arr)
});
Array.prototype.myevery
var arr = [1,2,3,4,56,-1];
var res = arr.every(function(item,index,arr){
  return item>0
});
console.log(arr,res);

Array.prototype.myevery = function(callback){
  for(let i =0 ;i<arr.length;i++){
    if(!callback(arr[i],i,arr)){
      return false
    }
  }
  return true

}
console.log(arr,arr.myevery(function(item,index,arr){
  return item > 0
  
}))
Array.prototype.mysome
let arr = [25,66,4,23,89];
let res = arr.some(function(item,index,arr){
  // 条件的判断
  return item > 6
})
console.log(arr,res)
Array.prototype.mysome = function(callback){
  for(let i =0;i<arr.length;i++){
    // 只要有一个满足条件true
  if( callback(arr[i],i,arr) ){
    return true
  };
  return false
  }
}
console.log(arr,arr.mysome(function(item,index,arr){
  // 条件的判断
  return item > 6
}))
Array.prototype.myfilter
var arr = [1,2,3,4,5,6];
var res = arr.filter(function(item,index,arr){
  return item>2
})
console.log(arr,res)

Array.prototype.myfilter = function(callback){
  // 判断每一项
  var newarr = []
  for(let i =0;i<arr.length;i++){
    if(callback(arr[i],i,arr)){
      newarr[newarr.length] = arr[i]
    }
  }
  return newarr
}
console.log(arr,arr.myfilter(function(item,index,arr){
  return item > 2
}))
Array.prototype.mymap
var arr = [1,2,3,4,5,99];
var res = arr.map(function(item,index,arr){
  return item + 5
})
console.log(arr,res);
Array.prototype.mymap = function(callback){
  let newarr = []
  for(let i = 0;i<arr.length;i++){
    newarr[newarr.length] = callback(arr[i],i,arr);
  }
  return newarr  
}
console.log(arr,arr.mymap(function(item,index,arr){
  return item + 5
}))

题目1给定一个数组(如[2, 7, 11, 15]),求任意两个数组元素(不能是同一个数组元素)值的和为某一个指定值(如9)的数组下标。

例如 给定[2, 7, 11, 15], target = 9,求符合条件数组元素下标return [0,1]

// 给定数组
const arr = [2,7,11,15];
// 指定值9
function sum(num){
  // 使用冒泡 外层3次
  for(let i =0;i<arr.length-1;i++){
    // 内层动态改变次
    for(let j=1;j<arr.length-i;j++){
      // k=第二个数的下标
      let k = j+i;
      if((arr[i]+arr[k]) == num){
        console.log(i,k)
        return i,k
      }
    }
  }
} 
sum(9);
sum(26);
sum(18);
sum(17);

题目2封装函数实现10得阶乘 最终输出10=10*9*8*7*6*5*4*3*2*1=3628800

// 定义全局变量sum
let sum = 1;
// 定义函数
function Jiec(num){
  // 阶层
  sum *= num;
  console.log(sum);
  num--;
  if(num>0){
    // 递归
    Jiec(num);
  }else{
    return sum
  }
}
Jiec(10)

题目3给出一个字符串 输出最长单词的长度(和数组一样可以使用for循环遍历,也可以通过length属性获取长度)

let str = 'i love china i not english chian';
// 字符串转数组
let arr = str.split(' ');
console.log(arr);
let max =arr[0];
//查找最大值
  for(let j=1;j<arr.length;j++){
      if(max.length>arr[j].length){
        max = max
      }else{
        max = arr[j]
      }
  }
// 输出
console.log(max);

题目4100到1000以内的水仙花数 个位立方+十位立方+百位立方=水仙花数

for(let i=100;i<1000;i++){
  let a = parseInt(i/100);
  let b = parseInt(i/10%10);
  let c = parseInt(i%10);
  if(a*a*a+b*b*b+c*c*c == i){
 // Math.pow(a,n)  求a的n方
    console.log(i);
  }
}

题目5反转字符串,将字符串str = 'i love china' 反转为china love i

let str = 'i love china';
// 使用.split方法将字符串转为数组
let arr = str.split(' ');
// 查看获取的数组arr
console.log(arr);
// 数组翻转方法.reverse()
arr = arr.reverse();
// 查看翻转数组
console.log(arr);
// 数组转字符串方法.join(' ')以空格分隔
arr = arr.join(' ');
// 打印输出
console.log(arr);

题目61-1000完美数一个数本身等于它的因子之和 6 = 1 + 2 + 3

// 1.遍历循环1~1000
for (let i = 1; i <= 1000; i++) {
  // 6.创建数组
  let arr = [];
  // 2.获取i的因子
  for (let j = 1; j <= i; j++) {
    // 3.判断j是否为i的因子
    if (i % j == 0) {
      // 4.去除i本身
      if (i != j){
        // 5.将因子放入数组
        arr.push(j);
      }
    }
  }
  let sum = 0;
  for(let k=0;k<arr.length;k++){
    // 7.遍历数组和判断是否等于i
    sum += arr[k]
  }
  if(sum == i){
    // 8.打印输出i是完美数
    console.log(i+'是完美数')
  }
}

题目7组合1-1000以内的三位数,要求个位十位百位各不相同

//1.1~1000三位数  即100~1000
for(let i=100;i<=1000;i++){
  // 2.百位数
  let a = parseInt(i/100);
  // 3.十位数
  let b = parseInt((i/10)%10);
  // 4.个位数
  let c = parseInt((i/1)%10);
  if(a != b&&b != c&&c != a){
    // 判断2,3,4各不相同输出i
    console.log(i);
  }
}

题目8随机生成1-9的三位数,要求个位十位百位各不相同

let arr = [];
let str = '';
// 1.循环无限产生1~9随机数字
for (let i = 1; 1 ; i++) {
  let j = Math.floor((Math.random() * 9) + 1); 8
  // 2.如果数组为空,直接插入
  if (arr.length == 0) {
    arr.push(j);   //3.如果数组长度为1 判断j是否不等于数组元素 是则插入
  }else if(arr.length == 1){
    if(arr[0] != j){
      arr.push(j)}   //4.如果数组长度为2 判断j是否不等于数组元素,是则插入
  }else if(arr.length == 2){
    if(arr[0] != j){
      if(arr[1] != j){
        arr.push(j)
      } 
    } //5.如果数组长度为3 跳出循环
  }else if(arr.length == 3){
    break;
  }
} //字符串拼接
str = arr.join('')
console.log(str);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值