js 复习

文章介绍了JavaScript中的数据结构和算法,包括Map的创建和方法,如has、set、get等;Math.floor函数的使用,返回小于等于给定数的最接近整数;链表的定义、赋值和取值操作;ES6中的Set特性,如唯一性、添加元素、删除元素等。此外,还提到了其他一些JavaScript内置函数和数组方法的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

new Map()的用法

  • 本质是键值对

  • 创建map

var mymap = new Map() // 创建空map

var map2 = new Map([[1,2],[true,3]]) // 有初始参数的map

  • map的 方法

  • has -- 判断是否有这个键

  • set -- 添加新键值

  • get -- 获取map某个键的值

  • delete -- 删除map某个元素

  • clear -- 清空map

  • size -- 返回map的成员数量

相关链接:http://t.csdn.cn/iySz2

Math.floor

Math.floor(x) 中x可以使一个数值,也可以是一个表达式。返回值小于等于x,且与x最接近的整数。

console.log(Math.floor(5/3)); //返回值为 1

链表的定义、赋值与取值

  • 定义链表ListNode时

  1. 链表的首个值不能为0,当首个参数为0时,代表着链表为空。

  1. 只需要定义一个ListNode xx = new ListNode(0);即可。即只定义一个空链表。

  1. 不需要定义长度 。

  • 赋值时

  1. 通过xx.next = new ListNode(4);来赋值,注意此时是赋值给下一个指针指向的位置,此时此链表一个值,值为4。

  • 取值时

  1. 取第一个值时,只需要xx.val即可。

  1. 取第二或之后的值时,需要xx = xx.next;int x = xx.val;这个方式取值。

  • 结合leetcode的第二题 两数相加

es6---new Set()

类似数组,但它的一大特性就是所有元素都是唯一的,没有重复的。可以利用这一特性进行数组的去重工作。

set()中的元素是有序的,

map是无序的,需要用到key去帮助索引,所以map()的key是有序的

有序的话,底层原理基本都是平衡二叉搜索树

  • 常用方法

  • 添加元素 add()

let list=new Set();

list.add(1)

  • 删除元素 delete(),删除数值

  • 判断某元素是否存在 has(),有返回true,无返回false

  • 清除所有元素 clear()

  • 遍历 keys()

letlist2=newSet(['a','b','c'])

for(letkeyoflist2.keys()){

console.log(key)//a,b,c

}

  • 遍历 values()

letlist=newSet(['a','b','c'])

for(letvalueoflist.values()){

console.log(value)//a,b,c

}

  • 遍历 foreach()

letlist=newSet(['4','5','hello'])

list.forEach(function(item){

console.log(item)

})

  • 数组转set(用于数组去重)

letset2=newSet([4,5,6])

  • set转数组

letset4=newSet([4, 5, 6])

//方法一 es6的...解构

letarr1= [...set4];

//方法二 Array.from()解析类数组为数组

letarr2=Array.from(set4)

charAt()

charAt()方法是可返回指定位置的字符,语法为【stringObject.charAt(index)】,其中index表示字符串中某个位置的数字,即字符在字符串中的下标。

字符串中的第一个字符的下标是0,如果参数 index 不在 0 与 string.length 之间,该方法将返回一个空字符串。

slice()

通过索引位置获取新的数组,该方法不会修改原数组,只是返回一个新的子数组。

用法:arrayObj.slice(start,end)

例1:获取仅包含最后一个元素的子数组

var arr=[1,2,3,4,5];

arr.slice(-1);//[5]

例2:获取不包含最后一个元素的子数组

var arr=[1,2,3,4,5];

arr.slice(0, -1);//[1,2,3,4]

例3:获取包含 从第二个元素开始的所有元素的子数组

var arr=[1,2,3,4,5];

arr.slice(1);//[2,3,4,5]

join()

用join函数将数组内的元素连接起来形成新的数组。

若为 join(""),则是以字符串的形式生成一个新的数组元素

例如:给数组中每个元素用“."连接

let arr=[255,444,222,1]

arr=arr.join(".")

//返回的是 arr=[255.444.]

对象的key:value && 多层数组

  • 对象

通过提取preson中的 key 值来进行解构提取

var preson = {Firstname : "John" , id : 555 , lasename : 'Doe'}

const {Firstname} = preson //通过提取preson中的 key 值来进行解构提取

  • 多层数组

通过这种多层数组的方法可以成功的在for循环中充当循环的条件,并且每一个都可以比较的到

像这种方法,也可以通过比较 前一个 value 的值,来赋予新的数组元素 symbol

var changeNum = [[1000, "M"], [900, "CM"], [500, "D"], [400, "CD"], [100, "C"], [90, "XC"], [50, "L"], [40, "XL"], [10, "X"], [9, "IX"], [5, "V"], [4, "IV"], [1, "I"]]

for(const [value,symbol] of changeNum){...}

//通过这种多层数组的方法可以成功的在for循环中充当循环的条件,并且每一个都可以比较的到

sort()

采用原地算法对数组进行排序,并返回数组。默认排序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的。

语法:arr.sort((a,b)=>{ return })

实例---给数字数组排序

  1. 升序,正常运用sort函数时,也是用 a, b 来告诉大家是用升序还是降序

arr.sort((a, b) => {

return a - b

})

或者写成

arr.sort((a,b)=> a-b)

  1. 降序

arr.sort((a, b) => {

return b - a

})

实例-----给对象数组按照某个属性排序

具体看链接 http://t.csdn.cn/M2EJz

abs()--返回一个树的绝对值

Number.MAX_SAFE_INTEGER

表示js中的最大的安全整数

数组方法--shift()

用于把数组的第一个元素从其中删除,并返回第一个元素的值

queue=[1,2,3,4,5],

constcurStr=queue.shift()//curStr=1

queue//此时的queue=[2,3,4,5]

unshift()

在数组开头添加新元素(可以代替需要反转数组的情况,减少运算时间),返回值为数组的新长度

unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度。

参数一必选,若要多添加几个就加几个元素

arrayObject.unshift(newele1,newelet2,…,neweleX)

提示:要把一个或多个元素添加到数组的尾部,请使用 push() 方法

构建新数组的方法(对象的取值)

constdigits='23'

constmap= { 2:'abc', 3:'def', 4:'ghi'}

for(leti=0;i<2;i++){

constletters=map[digits[i]]

}

//此时的letters 就是从map对象中取出key值跟digist[i]对应相等的值 ,就是 怎么从 js 对象中取出相应的 key 对应的 value

二分法

letstart=0;

letend=nums.length-1;

// >> 1 相当于除以2向下取整

letmid= (start+end)>>1;

Array from() == [...数组] ==slice(数组)

此方法可以将一个类数组对象或者可遍历的对象转换成一个真正的数组

题目说到的三种方法都可以得到一个新的数组,但slice不能放任何参数,才会把原本所有的数组给放进去

Array from()具体参考链接http://t.csdn.cn/78Tyj

创建二维数组

表示数组是m行n列的二维数组

//创建m行n列的数组并赋予“0”

方法一:

newArray(m).fill(newArray(n).fill(0)

方法二:

Array.from(Array(m+1), () =>Array(n+1).fill(0));

//单单只是创建了一个m行n列的数组

或者 Array(m).fill().map(item=>Array(n))

创建数组并赋值

//创建dp为n+1长的数组,并都赋值为0

//需要累加的,则应该用像这样定义一个数组

letdp=newArray(n+1).fill(0);

reduce

数组求和

letarr= [1,2,3,4,5]

console.log(arr.reduce((a,b) =>a+b)) // - 15

console.log(arr.reduce((a,b) =>a*b)) // - 120

"/" && floor &&排序求和往小取整初始化数组

floor是数学里往小取整

let sum = 23

sum/2 // 11.5

Math.floor(sum/2) //11

//sort 排序

stones = stones.sort((a,b)=>a-b)

//reduce 求和

const sum = (stones.reduce((a,b)=>a+b))

//floor 往小取整

const n = stones.length, m = Math.floor(sum / 2);

//创建数组并初始化为0

const dp = new Array(m+1).fill(0)

遍历给出的一维数组中的每个元素,且遍历每个元素中的里面一些元素

例如给出的数组为

strs = ["10", "0001", "111001", "1", "0"],计算出每个元素有多少个1和多少个0

这就是遍历一维数组的元素遍历,具体如下

strs = ["10", "0001", "111001", "1", "0"]

let x,y

for(let str of strs){//第一层for循环是遍历数组中的元素

x=0;

y=0;

for(let c of str){//第二层for循环时遍历元素中的元素

if(c==='0'){

x++;

}else{

y++;

}

}

}

完全背包

完全背包指的是每个物品可以用无数次

//先遍历物品或者背包都可以

//完全背包时正序遍历,指的是每个物品可以无限使用,

//零一背包的第二个循环得是倒序,为了保证每个物品只能用一次

for(let i = 0; i<物品数量; i++){ //遍历物品

for(let j = weight[i]; j<=bigweight; j++){//正序遍历背包,

}

分割字符串

s为传入的字符串

// 传入的是分割字符串的截取片段,传入的是为回文数的字符串s[startIndex,i]

path.push(s.slice(startIndex,i+1))

substr--截断字符串

语法

stringObject.substr(start,length)

还可以用来截断日期

例如:

<script type="text/javascript">

var time ="2019-02-26 14:27:56";

var timeAfter = time.substr(0,11);

console.log(timeAfter);

</script>

显示:

2019-02-26

贪心算法

由局部最优推出全局最优

max

可以用这个记录两者之间哪个数最大

初始化变量为Infinity

在涉及数字比较的算法时,可以使用Infinite初始化变量,用例是寻找数组的最小值。

具体用法可以参照如下链接https://dmitripavlutin.com/infinity-in-javascript/

isNaN()

isNaN() 函数用于检查其参数是否是非数字值。

如果参数值为 NaN 或字符串、对象、undefined等非数字值则返回 true, 否则返回 false。

isNaN(value)

reverse()

reverse() 方法用于颠倒数组中元素的顺序。

split()

string.split(separator,limit)

separator 分割字符或者正则(可选)

limit 返回的数组的最大长度(可选)

split() 方法用于把一个字符串分割成字符串数组。

返回值:以数组的形式返回

实例1(缺省分隔符)

var str = "hello world!hello man!how are you!";

var arr = str.split();

console.log(arr)

》["hello world!hello man!how are you!"]

实例2 以空格来分割

var str = "hello world!hello man!how are you!";

var arr = str.split(" ");

console.log(arr)

》["hello", "world!hello", "man!how", "are", "you!"]

实例3 每个字符作为数组的元素进行分割

var str = "hello world!hello man!how are you!";

var arr = str.split("");

console.log(arr)

》["h", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d", "!", "h", "e", "l", "l", "o", " ", "m", "a", "n", "!", "h", "o", "w", " ", "a", "r", "e", " ", "y", "o", "u", "!"

这一块的知识参照:http://t.csdn.cn/RRuSR

Math.random()

返回大于等于0小于1的一个随机数

Math.floor()

向小取整

Math.ceil()

向大取整

返回1-10之间一个随机整数

var rand1 = Math.floor(Math.random() * 10 + 1);

for...in for...of

for...in一般遍历对象,for...in的i得到键名,presonArr[i]得到键值

for...of一般遍历数组或用forEach遍历数组,for...of的i得到键值,personArr[i]为undefined

用for循环遍历对象的属性时,通常有两种方法

for(let i in Arr)==>此时的 i 循环的是key或者索引

for(let i of Arr)==>此时的 i 循环的是value

for...in循环出的是key,for...of循环出的是value

for...of是es-6新增的迭代器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值