1.数组去重
方式1;new Set
var arr1 = [1,2,3,2,4,1]
console.log(Array.from(new Set(arr1)))
console.log([…new Set(arr1)])
方式2:indexOf
function unique(arr){
var brr = []
for (var I = 0;i<arr.length:i++){
if (brr.indexOf(arr[i]) == -1){
brr.push(arr[i])
}
}
return brr
}
方式3
function unique(arr){
arr = arr.sort()
var brr = [[arr[0]]]
for (var I = 1;i<arr.length:i++){
if (arr[i] !== arr[i-1] ){
brr.push(arr[i])
}
}
return brr
}
找出多维数组最大值
function fnArray(arr){
var newArr = []
arr.forEach((item,index) =>{
newArr.push(Math.max(…item))
})
return newArr
}
console.log(fnArr([
[4,5,1,3], [13,27,18,26], [32,35,37,39], [1000,1001,857,1],
]))
如何自定义实现unshit
Array.prototype.myUnshit = function (){
const len = arguments.length
for (let i = len -1 ; i >=0;i--){
const element = arguments[i]
this.splice(0,0,element)
}
return this.lenth
}
let arr = [1,2,3]
console.log(arr.myUnshit(3,2,1),arr)
如何实现数组的随机排序
var arr = [1,2,3,4,5,6,7,8,9,10]
function result(arr) {
for (let i = 0;i < arr.lenth;i++){
let randomIndex = parseInt(Math.random() * arr.length)
// 存下当前正常索引值的对应数字
let curNum = arr[i]
arr[i] = arr[randomIndex]
arr[randomIndex] = curNum
}
return arr
}
arr.sort(() => Math.random - 0.5)
如何使用迭代的方法实现flattern函数
let arr = [1,2,[3,4,5,[6,7],8],9,10,[11,[12,13]]]
const flatten = function (arr) {
while (arr.some(v => Array.isArray(v))){
arr = [].concat(...arr)
}
return arr
}
const flatten = function (arr) {
return [].concat(...arr.map(v => (Array.isArray(v) ? flatten(v) : v)))
}
两数之和
const nums = [2,7,11,15]
const target = 9
function twoSum(nums,target){
for (let i = 0;i < nums.length;i++){
const num = nums[i];
const targetIndex = nums.indexof(taget - num)
if (targetIndex > -1 && targetIndex !== i){
return [i,targetIndex]
}
}
}
console.log(twoSum(nums,target))
sort背后原理是什么
sort()方法用于对数组的元素进行排序,并返回数组。默认排序顺序是根据字符串Unicode码点。
array.sort(sortBy);参数sortBy可选。规定排序顺序。必须是函数。
注:如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说的更精准点,是按照编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较
V8引擎sort函数只给出了两种排序 InsertionSort 和 QuickSort,数量小于10的数组使用 InsertionSort,比10大的数组则使用QuickSort
之前的版本是:插入排序和快排,现在是冒泡
给字符串新增方法实现功能
String.prototype.addPrefix = function(str){
return str + this
}
Console.log('world'.addPrefix('hello'))
找出字符串出现最多次数的字符
var str = 'aaabbbbbccdddddddddd'
var obj = {}
for (var I =0;i < str.length;i++){
var char = str.charAt(i)
if (obj[char]){
obj[char]++
}else {
obj[char] = 1
}
}
console.log(obj)
// 统计出来的最大值
var max = 0
var maxChar = ''
for (var key in obj) {
if (max < obj[key]){
max = obj[key]
maxChar = key
}
}
slice是干嘛的,splice是否会改变原数组
- slice是来截取的,返回的是一个新的数组;参数可以写slice(3),slice(1,3),slice(-3)
- splice 功能有:插入、删除、替换;返回的是:删除的元素,会改变原数组
find和filter区别
- 区别一:返回的内容不同
filter 返回时新数组,不改变原素组
find 返回具体的内容,匹配的是第一个满足条件的结果,不改变原数组
- 区别二:
find :匹配的是第一个满足条件的结果
filter:返回整体(每一个匹配到都返回)
let arr = [123,13,13,1,31,1,2,4]
console.log(arr.filter(val =>{return val > 2})) // [123,13,13,31,4]
console.log(arr.find(val =>{return val > 2})) // 123
some和every的区别
some : 如果有一项匹配则返回true
every:全部匹配才会返回true
var arr = [1,4,2,10,6]
var brr = arr.some(val = {
return val > 4
})
var crr = arr.every(val = {
return val > 4
})
console.log(brr,crr) // true,false
手动实现发布订阅
class EventEmitter {
handlers = {}
on(type,handlers,once = false){
if(!this.handlers[type]){
this.handlers[type] = []
}
if(!this.handlers[type].includes(handler)){
this.handlers[type].push(handler)
handler.once = once
}
}
once(type,handler){
this.on(type,handler,true)
}
off(type,handler){
if(this.handlers[type]){
this.handlers[type] = this.handlers[type].filter(h => {
return h != handler
})
}
}
trigger(type){
if (this.handlers[type]){
this.handlers[type].forEach(handler =>{
handler.call(this);
if (handler.once){
this.off(type,handler)
}
})
}
}
}
const ev = EventEmitter()
function handler1(){
console.log('handler1')
}
function handler2(){
console.log('handler2')
}
function handler3(){
console.log('handler3')
}
ev.on('test',handler1)
ev.once('test',handler2)
ev.on('test',handler3)
ev.trigger('test')
ev.trigger('test')
打印100以内的质数如何实现
质数 :只能被1和自身整除
var count = 0
for (let i = 2;i <= 100;i++){
for (let j = 1;j<= i;j++){
if (i %j === 0){
count++
}
}
// 从1开始,到自身都被%完,1 自身整除 count === 2
if (count === 2){
console.log(i)
}
count = 0
}
如何提URL中的参数
let url = 'https://alibaba.com?a=1&b=2&c=3#hash'
function queryURLParams(URL){
let url = URL.split('?')[1]
const urlSearchParams = new URLSearchParams(url)
const params = Object.fromEntries(urlSearchParams.entries())
return params;
}
console.log(queryURLParams(url))
如何获取范围内的指定随机数
Math.round(num) // 四舍五入
Math.floor(num) // 向下取整
Math.ceil(num) // 向上取整
function fn(min,max){
return Math.floor(Math.random() * (max - min) + min)
}
闭包
JS防抖
应用场景:输入框搜索,按钮的重复点击,上拉滚动加载,用户的缩放事件
工作原理:当事件触发时并不会立即执行回调,而是会等待一段时间 如果在等待时间再次触发事件,会继续等待 只有等待期间无新的事件触发才会执行回调
const debounce = (fn,delay) => {
let timeout;
return () =>{
if (timeout) clearTimeout(timeout)
timeout = setTimout(() => {
fn()
},delay)
}
}
JS截流
应用场景:下拉刷新、鼠标移动、拖拽组件
const throttle = (fn,wait) = {
let lastCallTime = 0
const throttled = function(...arg){
const now = Date.now()
if (now - lastCallTime >= wait){
fn.call(this,...arg);
lastCallTime = now
}
}
return throttled
}