数组
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、找字符串里面的最长的单词
在这里插入代码片