JS开发必须知道的常用技巧(持续更新...)

1.数组

1.1数组去重

普通数组

Array.from(new Set([1, 2, 3, 3, 4, 4]))    //[1,2,3,4]
[...new Set([1, 2, 3, 3, 4, 4])]   //[1,2,3,4]

数组对象

const arr = [
 { name: 'name1', id: 1 },
 { name: 'name2', id: 2 }, 
 { name: 'name3', id: 3 }, 
 { name: 'name1', id: 1 }, 
 { name: 'name4', id: 4 }, 
 { name: 'name5', id: 5 }
 ];
 const result = [];
 arr.forEach(item=>{
    !result.some(v => JSON.stringify(v) === JSON.stringify(item)) && result.push(item)
 })
 console.log(result) 
//[{ name: 'name1', id: 1 },{ name: 'name2', id: 2 },{ name: 'name3', id: 3 },{ name: 'name4', id: 4 },{ name: 'name5', id: 5 }]

1.2数组交集

普通数组

const arr1 = [1, 2, 3, 4, 5 , 8 ,9],arr2 = [5, 6, 7, 8, 9];

const intersection = arr1.filter( (val) => { return arr2.indexOf(val) > -1 })
console.log(intersection) //[5, 8, 9]

数组对象

const arr1 = [
 { name: 'name1', id: 1 }, 
 { name: 'name2', id: 2 },
 { name: 'name3', id: 3 }, 
 { name: 'name5', id: 5 }
 ];
const arr2 = [
 { name: 'name1', id: 1 }, 
 { name: 'name2', id: 2 },
 { name: 'name3', id: 3 }, 
 { name: 'name4', id: 4 }, 
 { name: 'name5', id: 5 }
 ];
const result = arr2.filter(function (v) {
  return arr1.some(n => JSON.stringify(n) === JSON.stringify(v))
})
console.log(result); 
// [{ name: 'name1', id: 1 },{ name: 'name2', id: 2 },{ name: 'name3', id: 3 },{ name: 'name5', id: 5 }]

1.3数组并集

普通数组

const arr1 = [1, 2, 3, 4, 5, 8, 9]
const arr2 = [5, 6, 7, 8, 9];
const result = arr1.concat(arr2.filter(v => !arr1.includes(v)))
console.log(result) //[1, 2, 3, 4,5, 8, 9]

数组对象

const arr1 = [
  { name: 'name1', id: 1 },
  { name: 'name2', id: 2 },
  { name: 'name3', id: 3 }
  ];
const arr2 = [
 { name: 'name1', id: 1 },
 { name: 'name4', id: 4 }, 
 { name: 'name5', id: 5 }
 ];
let arr3 = arr1.concat(arr2);
let result = [];
let obj = [];
result = arr3.reduce(function (prev, cur, index, arr) {
  obj[cur.id] ? '' : obj[cur.id] = true && prev.push(cur);
  return prev;
}, []);
console.log(result); 
//[{ name: 'name1', id: 1 },{ name: 'name2', id: 2 },{ name: 'name3', id: 3 },{ name: 'name4', id: 4 },{ name: 'name5', id: 5 }]

1.4数组差集

普通数组

const arr1 = [1, 2, 3, 4, 5, 8, 9]
const arr2 = [5, 6, 7, 8, 9];
const diff = arr1.filter(item => !new Set(arr2).has(item))
console.log(diff) //[ 1, 2, 3, 4 ]

数组对象

// 对象数组
let arr1 = [
 { name: 'name1', id: 1 },
 { name: 'name2', id: 2 },
 { name: 'name3', id: 3 }
];
let arr2 = [
 { name: 'name1', id: 1 }, 
 { name: 'name4', id: 4 }, 
 { name: 'name5', id: 5 }
];
let result = arr1.filter(function (v) {
  return arr2.every(n => JSON.stringify(n) !== JSON.stringify(v))
})
console.log(result); 
// [ { name: 'name2', id: 2 }, { name: 'name3', id: 3 } ]

1.5数组排序

普通数组

[1, 2, 3, 4].sort((a, b) => a - b);   // [1, 2,3,4] 升序
[1, 2, 3, 4].sort((a, b) => b - a);   // [4,3,2,1] 降序

对象数组

const arr1 = [
 { name: "Rom", age: 12 },
 { name: "Bob", age: 22 }
]
arr1.sort((a, b) => { return a.age - b.age }) //升序
const arr2 = [
 { name: "Rom", age: 12 },
 { name: "Bob", age: 22 }
]
arr2 .sort((a, b) => { return -a.age + b.age }) //降序
console.log(arr1) // [ { name: 'Rom', age: 12 }, { name: 'Bob', age: 22 } ]
console.log(arr2) // [{ name: 'Bob', age:22 }, { name: 'Rom', age: 12 }]

1.6数组最大值

普通数组

Math.max(...[1, 2, 3, 4]) //4
Math.max.apply(this, [1, 2, 3, 4]) //4
[1, 2, 3, 4].reduce((prev, cur, curIndex, arr) => {
   return Math.max(prev, cur);
}, 0) //4

对象数组(取数组对象中id的最大值)

const arr = [
{ id: 1, name: 'jack' },
{ id: 2, name: 'may' },
{ id: 3, name: 'shawn' },
{ id: 4, name: 'tony' }
]
const arr1 = Math.max.apply(Math, arr.map(item => { return item.id }))
const arr2 = arr.sort((a, b) => { return b.id - a.id })[0].id
console.log(arr1) // 4
console.log(arr2) // 4

1.6数组求和

普通数组

[1, 2, 3, 4].reduce(function (prev, cur) {
  return prev + cur;
}, 0) //10 

数组对象

const sum = [{age:1},{age:2}]
sum.reduce(function (prev, cur) {
  return prev + cur.age;
}, 0)   //3

1.7数组是否包含值

普通数组

console.log([1, 2, 3].includes(4)) //false
console.log([1, 2, 3].indexOf(4)) //-1 如果存在换回索引
console.log([1, 2, 3].find((item) => item === 3)) //3 如果数组中无值返回undefined
console.log([1, 2, 3].findIndex((item) => item === 3)) //2 如果数组中无值返回-1

数组对象

const flag = [{age:1},{age:2}]
flag.some(v=>JSON.stringify(v)===JSON.stringify({age:2}))
console.log(flag)

1.8数组转对象

const arrName = ['张三', '李四', '王五']
const arrAge=['20','30','40']
const arrDec = ['描述1', '描述2', '描述3']
const obj = arrName.map((item,index)=>{
  return { name: item, age: arrAge[index],dec:arrDec[index]}
})
console.log(obj) 
// [{ name: '张三', age: '20', dec: '描述1' },{ name: '李四', age: '30', dec: '描述2' },{ name: '王五', age: '40', dec: '描述3' }]

2.字符串截取

2.1截取前n位字符

const str = abcdefghijklmn
str=str.substring(0,5)
console.log(str)  // abcde

2.2截掉前5位字符

const str = abcdefghijklmn
str=str.substring(5)
console.log(str)  // fghijklmn

2.3截取后5位字符

const str = abcdefghijklmn
str=str.substring(str.length-5)
str=str.substring(str.length-5,str.length)
console.log(str)  // jklmn

2.4截掉后5位字符

const str = abcdefghijklmn
str=str.substring(0,str.length-5)
console.log(str)  // abcdefghi

2.5截取从第6位到第9位的字符串

const str = abcdefghijklmn
str=str.substring(6,10)
console.log(str)  // fghi

2.6将字符串abcde 替换成ABCDE

const str = abcdefghijklmn
str=str.replace("abcde","ABCDE")
console.log(str)  // ABCDEfghijklmn

2.7从开始截取到指定字符 (该字符出现的第一次)

const str = abcdefghijklmn
const k = 'kl'
str=str.substring(0,str.indexOf(k)+ k.length);
console.log(str)  // abcdefghijkl

3.多个判断条件优化写法

//优化前if判断
statusText(value) {
      if (value === '0') {
        return '你好'
      }
      if (value === '1') {
        return '我好'
      }
      if (value === '2') {
        return '他好'
      }
      if (value === '3') {
        return '大家好'
      }
      if (value === '4') {
        return '你不好'
      }
      if (value === '5') {
        return '我不好'
      }
}

//优化后
fucntion statusText(value){
    return ['你好', '我好','他好', '大家好', '你不好', '我不好'][value]
}      
//优化前
if(value == '你' || value == '我'  || value == '她' || value == '大家'){
  return ...
}

//优化后
if(['你', '我','她','大家'].indexOf(value) == 0){
  return ...
}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

前端探险家

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

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

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

打赏作者

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

抵扣说明:

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

余额充值