// attr:根据该属性排序;rev:升序1或降序-1,不填则默认为1
function sortBy(attr, rev) {
if (rev == undefined)
rev = 1
else (rev) ? 1 : -1
return function (a, b) {
a = Number(a[attr].split('A')[1])
b = Number(b[attr].split('A')[1])
if (a < b)
return rev * -1
if (a > b)
return rev * 1
return 0
}
}
let aa = [{a:'CRA004'},{a:'CRA001'},{a:'CRA003'},{a:'CRA002'},{a:'CRA005'}]
let b = aa.sort(sortBy('a',1))
字面量和new关键字创建的对象是Object的实例,原型指向Object.prototype,继承内置对象Object
Object.create(arg, pro)创建的对象的原型取决于arg,arg为null,新对象是空对象,没有原型,不继承任何对象;arg为指定对象,新对象的原型指向指定对象,继承指定对象
使用方法简述:
const controller = new AbortController();
const signal = controller.signal;
setTimeout(()=>controller.abort(),5000); // 5秒后取消接口调用
fetch(url,{signal}).then(res=>{
return response.text();
}).then(text=>{AbortController详解
console.log(text);
})
AbortController-中止请求-CSDN博客文章浏览阅读2.7k次。控制器+信号机动满足AbortController和AbortSignal:const controller = new AbortController();const signal = controller.signal;控制器只有一种方法:controller.abort();当你这样做时,它会通知信号:signal.addEventListener('abort', () => { // Logs true: console.log(signal.abo_abortcontrollerhttps://blog.csdn.net/weixin_45226867/article/details/118599327
比较函数会接受两个参数,并对两者进行比较
若第一个参数应位于第二个参数之前,则返回一个负数
若第一个参数等于第二个参数,则返回0
若第一个参数应位于第二个参数之后,则返回一个正数
通过以上逻辑的比较函数,会使数组最后变为升序排列,
若要变为降序,只需返回一个负数变为返回一个正数即可(正数变负数,负数变正数)
比较函数不能对混搭(字符+数字)数组进行排序
不能将比较函数用于比较一个不能转化成数字的字符串和数组的排序,
这是因为比较函数会先将字符串转化成数字再比较,当字符串不能转换成数字时,就不能比较大小(不用比较函数,也就是sort不加参数时,比较的是ASCII值,此时可以比较)
总结:
1. 数组中既有字符串又有数字时,先看看其中的字符串是字母型字符串还是数字型字符串,
2. 若是字母型字符串,sort不用带参数,直接比较ASCII值
若是数字型字符串,sort带参数,让比较函数将字符串转换成数字再比较
3.对于由对象构成的数组,如何排序?
需求
数组项是对象,现在需要根据对象的某个属性,对数组进行排序
function aa(n){ // n表示天数
let u = 0.01;
let s=0;
let tip='';
for(let i=0;ilet c = u*(Math.pow(2,i))
s+=c;
if(s>1){
s = Math.floor(s)
}
if(i===n-1){
tip = '第'+(i+1)+'天:'+ c
}
}
return [s,tip];
}
结果:[10737407, '第30天:5368709.12'] ,1073万,吓死人...
h5 的a标签有个download属性,可以指定下载的文件名
点我预览
当遇到跨域问题的时候,本地启动node服务器:
serve.js
import http from 'http';
import path from 'path'
import fs from 'fs';
import url from 'url';
import c from 'child_process';
// 代理配置
let conifg = {
'/api': { // 需要拦截的本地请求路径
target: 'http://t.weather.itboy.net', // 真实代理地址 CRP服务
// target: 'http://10.31.27.199', // 真实代理地址 target: 'http://10.31.27.199:8087/', 林凤颜
// port: 8087, // 端口,默认80
},
};
// 创建http服务
let app = http.createServer(function (request, response) {
let urls = request.url === '/' ? 'index.html' : request.url;
// 存在代理地址,走代理请求
if (hasProxy(urls, request, response)) {
return;
}
var pathname = url.parse(request.url).pathname;
var extname = path.extname(pathname);
// 普通请求和资源加载
fs.readFile(pathname.substr(1), function (err, data) {
let type = memu(extname);
if (err) {
console.log('请求失败', err);
response.writeHead(404, {'Content-Type': type});
}else{
response.writeHead(200, {
'Content-Length': data.length,
'Content-Type': type
});
// 响应文件内容
response.write(data);
}
// 发送响应数据
response.end();
});
});
function memu (exname) {
switch(exname){
case ".html":
return "text/html";
break;
case ".css":
return "text/css";
break;
case ".jpg":
return "image/jpg";
break;
case ".png":
return "image/png";
break;
case ".js":
return "text/javascript";
break;
case ".json":
return "text/json";
break;
case ".jpeg":
return "image/jpeg";
break;
case ".gif":
return "image/gif";
break;
case ".svg":
return "image/svg+xml";
break;
case ".rtf":
return "application/rtf";
break;
case ".woff":case ".woff2":
return "application/x-font-woff";
break;
case ".webm":
return "video/webm";
break;
default:
return "text/plain";
}
}
// 判断是否存在代理地址
function hasProxy (url, request, response) {
for (const key in conifg) {
if (url.indexOf(key) < 0) {
continue;
}
const { target, port } = conifg[key];
let info = target.split('//');
let opts = { // 请求参数
protocol: info[0],
host: info[1],
port: port || 80,
method: request.method,
path: url,
json: true,
headers: {
...request.headers,
host: info[1],
referer: target + url
}
}
proxy(opts, request, response);
return true;
}
return false;
}
// 代理转发
function proxy(opts, request, response) {
// 请求真实代理接口
var proxyRequest = http.request(opts, function (proxyResponse) {
// 代理接口返回数据,写入本地response
proxyResponse.on('data', function (chunk) {
response.write(chunk, 'binary');
});
// 代理接口结束,通知本地response结束
proxyResponse.on('end', function () {
response.end();
});
response.writeHead(proxyResponse.statusCode, proxyResponse.headers);
});
// 本地接口数据传输,通知代理接口请求
request.on('data', function (chunk) {
proxyRequest.write(chunk, 'binary');
});
// 本地请求结束,通知代理接口请求结束
request.on('end', function () {
proxyRequest.end();
});
}
app.listen(9001);
c.exec('start http://localhost:9001/index.html'); // 启动服务器
console.log('server is listen on 9001....');
下载文件页面:
点我预览
tab-index="-1">Inside the trap
Can't break out
Stuck here forever
它接受一个整数作为值,具有不同的结果,具体取决于整数的值:
tabindex="0"
,表示元素是可聚焦的,并且可以通过键盘导航来聚焦到该元素,它的相对顺序是当前处于的 DOM 结构来决定的。根据键盘序列导航的顺序,值为 0
、非法值、或者没有 tabindex 值的元素应该放置在 tabindex 值为正值的元素后面。
默认支持以下内容对比
安装:
yarn add v-code-diff
引入:import CodeDiff from 'v-code-diff';
app.use(i18)
.use(createPinia())
.use(router)
.use(CodeDiff)
.mount('#app')
使用:
柯里化就是将多个入参的函数拆分成多个函数,每个函数只接受一个参数;
如在项目.gitignore文件中的使用:
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
.DS_Store
dist
dist-ssr
coverage
*.local
/cypress/videos/
/cypress/screenshots/
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
*.tsbuildinfo