javascript 数组、字符串操作

数组

1、计算给定数组 arr 中所有元素的总和

function sum(arr) {
    let sum =0
    for(let i = 0 ; i < arr.length ; i++ ){
        sum+=arr[i]
    }
    return sum
    }

2、合并数组 arr1 和数组 arr2。不要直接修改数组 arr,结果返回新的数组

// ES6 拓展符
Arr = [...arr,...arr2]

// concat
let Arr =arr.concat(arr2)

3、删除数组 arr 第一个元素。不要直接修改数组 arr,结果返回新的数组

function del(arr) {
    let a = [...arr]
    a.shift()
    return a
}

4、在数组 arr 开头添加元素 item。不要直接修改数组 arr,结果返回新的数组

function add(arr,item) {
    let a = [...arr]
    a.unshift(item)
    return a
}

5、移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作, 并将结果返回

function removeWithoutCopy(arr, item) {
        for(var i=0;i<arr.length;i++){
          if(arr[i]==item){
            arr.splice(i,1);
            i--;
            arr.length--;
          }

        }
        return arr
      }

6、找出元素 item 在给定数组 arr 中的位置

function search(arr,item) {
    for(let i = 0; i < arr.length ; i++){
        if(arr[i] == item){
            return  i
        }
    }
}

7、数组降维

// 纯数字
function flat(arr) {
    arr+='' // 变为字符串
    arr = arr.split(',')
    let ls=[]
    for(let i = 0 ; i < arr.length ;i++){
        ls.push(arr[i]*1)
    }
   return ls
}

// flat()
function flat(arr) {
    let ls = arr.flat(Infinity)
   return ls
}
// concat()
function flat(arr) {
    for(let i = 0 ; i < arr.length ;i++){
        if(arr[i] instanceof Array){
            arr[i] = flat(arr[i])
        }
    }
    return Array.prototype.concat.apply([],arr)
}
//reduce的使用
let arr = [[0, 1], [2, 3], [4,[5,6,7]]]
const newArr = function(arr){
   return arr.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newArr(cur):cur),[])
}
console.log(newArr(arr)); //[0, 1, 2, 3, 4, 5, 6, 7]

8、求数组min值和max值

// Math.max
    let num = Math.max.apply([],arr)


// for循环比较
function max(arr) {
    let max
    for(let i = 0 ; i < arr.length ; i++){
        if(max > arr[i]){
            max
        }else{
            max = arr[i]
        }
    }
    return max
}

9、数组去重

// set
function set(arr) {
    let ls = new Set(arr)
    let ls1 = Array.from(ls)
    return ls1
}

// 通过indexOf 判断是否重复
function set(arr) {
    let ls =[]
    for(let i = 0 ; i < arr.length ; i++){
        if(ls.indexOf(arr[i]) == -1){
            ls.push(arr[i])
        }
    }
    return ls
}
// 双重for循环
 function set(arr) {
    for (var i = 0, len = arr.length; i < len; i++) {
      for (var j = i + 1, len = arr.length; j < len; j++) {
        if (arr[i] === arr[j]) {
          arr.splice(j, 1);
          j--;        // 每删除一个数j的值就减1
          len--;      // j值减小时len也要相应减1(减少循环次数,节省性能)
          // console.log(j,len)

        }
      }
    }
    return arr;
 }

10、要求找出数组中和为target的两个元素并返回

getNums(arr){
    let target = 10
    if(arr == '' || arr.length == 0){
      return false
    }
    let left = 0
    let right = arr.length - 1
    while (left < right){
      if(arr[left] + arr[right] < target){
        left ++
      }else if(arr[left] + arr[right] > target){
        right --
      }else{
        console.log(`相加为${target}的两个元素是第${left}个元素${arr[left]}和第${right}个元素${arr[right]}`)
        left ++
        right --
      }
    }
  }

11、随机打乱一个数组


//思路1:
 
function shuffle(arr) {
    let index = Math.floor(Math.random()*arr.length)
    let rnd 
    for(let i = 0 ; i < arr.length ;i++){
        rnd = arr[index]
        arr[index] = arr[i]
        arr[i] = rnd
    }
    return arr
}
 
//思路2:
var arr2 = [1,2,3,4,5,6,7]
function Ran(a,b){
return Math.random() >=0.5 ? 1 :-1
}
arr2.sort(Ran)
console.log(arr2)

12、封装一个格式化时间对象的函数,将时间格式化成yyyy-mm-dd hh-mm-ss 格式

在这里插入代码片

13、将一个数组中所有元素放到字符串中,并以’,'分割?

let a = arr.join()
arr+=''

14、数组 a=[1,2,3] 变成数组 [4,3,2,1]

arr.reverse()

15、有一个长度未知的数组a,如果它的长度为0就把数字1添加到数组里面,否则按照先进先出的队列规则让第一个元素出队。

function isLength(arr) {
     if(arr.length == 0 ){
         arr.push(1)
     }
     else(
         arr.shift()
     )
    return arr
}

字符串

1、解析 URL Params 为对象

let url = 'http://www.domain.com/?user=anonymous&id=123&id=456&city=%E5%8C%97%E4%BA%AC&enabled';
parseParam(url)
/* 结果
{ user: 'anonymous',
  id: [ 123, 456 ], // 重复出现的 key 要组装成数组,能被转成数字的就转成数字类型
  city: '北京', // 中文需解码
  enabled: true, // 未指定值得 key 约定为 true
}
*/
function parseParam(url) {
  const paramsStr = /.+\?(.+)$/.exec(url)[1]; // 将 ? 后面的字符串取出来
  const paramsArr = paramsStr.split('&'); // 将字符串以 & 分割后存到数组中
  let paramsObj = {};
  // 将 params 存到对象中
  paramsArr.forEach(param => {
    if (/=/.test(param)) { // 处理有 value 的参数
      let [key, val] = param.split('='); // 分割 key 和 value
      val = decodeURIComponent(val); // 解码
      val = /^\d+$/.test(val) ? parseFloat(val) : val; // 判断是否转为数字

      if (paramsObj.hasOwnProperty(key)) { // 如果对象有 key,则添加一个值
        paramsObj[key] = [].concat(paramsObj[key], val);
      } else { // 如果对象没有这个 key,创建 key 并设置值
        paramsObj[key] = val;
      }
    } else { // 处理没有 value 的参数
      paramsObj[param] = true;
    }
  })

  return paramsObj;
}

2、模板引擎实现

let template = '我是{{name}},年龄{{age}},性别{{sex}}';
let data = {
  name: '姓名',
  age: 18
}
render(template, data); // 我是姓名,年龄18,性别undefined
function render(template, data) {
  const reg = /\{\{(\w+)\}\}/; // 模板字符串正则
  if (reg.test(template)) { // 判断模板里是否有模板字符串
    const name = reg.exec(template)[1]; // 查找当前模板里第一个模板字符串的字段
    template = template.replace(reg, data[name]); // 将第一个模板字符串渲染
    return render(template, data); // 递归的渲染并返回渲染后的结构
  }
  return template; // 如果模板没有模板字符串直接返回
}

3、驼峰命名

function tfStr(str) {
    let ls = str.split(' ')
    let str1 =[]
    for(let i = 0 ; i < ls.length ; i++){
        let a = ls[i].charAt(0).toLocaleUpperCase()+ls[i].slice(1).toLocaleLowerCase()
        str1.push(a)
    }

    return str1.join(' ')
    
}

4、查找字符串中出现最多的字符和个数
例: abbcccddddd -> 字符最多的是d,出现了5次

function search(str) {
    let obj={}
    for(let i = 0;i < str.length; i++){
        let cur = str[i]
        if(!obj[cur]){
            obj[cur] = []
        }
        obj[cur].push(cur)
    }
    let name 
    let num = 0
    for(item in obj){
        if(num < obj[item].length){
            num = obj[item].length
            name = obj[item][0]
        }
    }
    a={
        'num':num,
        'name':name
    }
    return a
    }

5、字符串查找
请使用最基本的遍历来实现判断字符串 a 是否被包含在字符串 b 中,并返回第一次出现的位置(找不到返回 -1)。

在这里插入代码片

6、实现千位分隔符

// 解法1:

function format(num){
 num=num+'';//数字转字符串
  var str="";//字符串累加
  for(var i=num.length- 1,j=1;i>=0;i--,j++){
      if(j%3==0 && i!=0){//每隔三位加逗号,过滤正好在第一个数字的情况
          str+=num[i]+",";//加千分位逗号
          continue;
      }
      str+=num[i];//倒着累加数字
  }
  return str.split('').reverse().join("");//字符串=>数组=>反转=>字符串

// 解法二:
function format(str){
      let reg = /\d{1,3}(?=(\d{3})+$)/g
      return (str+'').replace(reg,'$&,')

}

7、判断是否是电话号码


8、验证是否是邮箱

在这里插入代码片

9、验证是否是身份证

在这里插入代码片

10、找字符串里面的最长的单词

在这里插入代码片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值