【JS】实用/常用函数/Function方法

时间:2022-04-23 09:07:49

1.获取日月 时分秒

  //获取 月日
getMonth=(time)=>{
var date = new Date(time)
var month = date.getMonth()+<?''+(date.getMonth()+):(date.getMonth()+)
var date = date.getDate()<?''+date.getDate():date.getDate()
return month+'-'+date
} //获取时分秒
getTime=(time)=>{
var date = new Date(time)
var hours = date.getHours()<?''+date.getHours():date.getHours()
var minutes = date.getMinutes()<?''+date.getMinutes():date.getMinutes()
var second = date.getSeconds()<?''+date.getSeconds():date.getSeconds()
return hours+':'+minutes+':'+second
}

使用:

const CreatedAt =  '0001-01-01T00:00:00Z'

  <Text style={{fontSize: , color: '#999999', marginRight: }}> { this.getMonth(item.CreatedAt) }  </Text>

2.短信倒计时

按钮

<Touchable
style={{
position: 'absolute',
right: ,
bottom: ,
backgroundColor: theme.bgc0,
borderRadius: ,
justifyContent: 'center',
alignItems: 'center',
width: ,
marginRight: ,
height:,
}}
onPress={() => {
this.send_sms();
}}
>
<View>
<Text style={{
color: '#FFFFFF',
fontSize:,
}}>{buttonText}</Text>
</View>
</Touchable>

发送验证码函数

  send_sms() {
WalletAction.getVerificationCode().then((res) => {
if (res.status === ) {
Toast.message('验证码发送成功');
this.setState({ disabled: true });
this._setTimeout();
} else { Toast.message(res.message);
this.setState({ disabled: false });
}
});
}

倒计时函数

_setTimeout(number) {
if (number) {
if (this.state.time > ) {
return;
}
this.setState({
time: number - ,
buttonText: `${number - }秒后重发`,
}, () => {
this._setTimeout();
});
return;
}
if (this.state.time < ) {
this.setState({
buttonText: '获取验证码',
disabled: false,
}); } else {
this.setState({
time: this.state.time - ,
buttonText: `${this.state.time}秒后重发`,
});
this.timer = setTimeout(() => {
this._setTimeout();
}, );
}
}

extra:一般倒计时

   countTime = (endTime) => {
//获取当前时间
let date = this.state.currentTime;
let now = date.getTime();
//设置截止时间
let endDate =moment(endTime)._d;
let end = endDate.getTime();
//时间差
let leftTime = end - now;
//定义变量 d,h,m,s保存倒计时的时间
let d, h, m, s;
if (leftTime >= 0) {
d = Math.floor(leftTime / 1000 / 60 / 60 / 24);
h = Math.floor(leftTime / 1000 / 60 / 60 % 24);
m = Math.floor(leftTime / 1000 / 60 % 60);
s = Math.floor(leftTime / 1000 % 60);
}
// console.log('1',new Date("2020-6-01 00:00:00"))
return d + "天" + h + "时" + m + "分" + s + "秒"
};
   {
title: '剩余时长',
width: 200,
dataIndex: '',
key: '',
render:(text,record) => (
<div>{this.countTime(record.end_time)}</div>
)
}
 

3.计时器: 时分秒

  countTime() { // 记录已用聊天时间
this._timer = setInterval(() => {
let {seconds} = this.state; // 获取秒
let {minutes} = this.state; // 获取分钟
let {hour} = this.state; // 获取小时
if (seconds < ) { // 秒数如果小于60 就加1
seconds++;
if (seconds == ) { // 秒数如果等于60 就 重置为0
seconds = ,
minutes = ++minutes;
if (minutes == ) {
minutes = ;
hour = ++hour;
}
}
this.setState({
seconds, // 更改秒的状态
minutes, // 更改分钟的状态
hour, // 更改小时的状态
});
}
}, );
} <Text style={{fontSize: , color: '#fff'}}>
{
hour.toString().length == ? null :
}
{hour}
:
{
minutes.toString().length == ? null :
}
{minutes}
:
{
seconds.toString().length == ? null :
}
{seconds}
</Text>

4.评分组件

import React, { Component } from 'react'
import {
View,
StyleSheet,
TouchableOpacity,
Image,
} from 'react-native';
import PropTypes from 'prop-types'; export default class StarRating extends Component {
static defaultProps = {
maxStars: ,
rating: ,
starSize: -,
interItemSpacing: ,
valueChanged: (index) => { },
editAble: true,
};
static propTypes = {
maxStars: PropTypes.number,
rating: PropTypes.number,
unSelectStar: PropTypes.number,
valueChanged: PropTypes.func,
starSize: PropTypes.number,
interItemSpacing: PropTypes.number,
editAble: PropTypes.bool,
}; constructor(props) {
super(props);
this.state = {
maxStars: this.props.maxStars,
rating: this.props.rating,
firstImageLayout: null,
starSize: this.props.starSize,
};
} render() {
let starArray = [];
let imageSource = null;
for (let i = ; i <= this.state.maxStars; i++) {
if (i <= this.props.rating) {
imageSource = this.props.selectStar;
}
else {
imageSource = this.props.unSelectStar;
} let styleArray = [];
if (i !== this.state.maxStars) {
styleArray.push({ marginRight: this.props.interItemSpacing });
}
if (this.state.starSize > ) {
styleArray.push({ width: this.state.starSize, height: this.state.starSize });
} //push Image
starArray.push(
<TouchableOpacity
key={i}
onPress={() => {
if (this.props.editAble) {
this.props.valueChanged(i)
}
}}
>
<Image
source={imageSource}
style={styleArray}
/>
</TouchableOpacity>
);
}
return (
<View
style={styles.container}
>
{starArray}
</View>
)
} }; const styles = StyleSheet.create({
container: {
flexDirection: 'row',
justifyContent: 'center',
alignItems: 'center',
}
});

使用:

<StarRating
maxStars={} // 最大星星数量
rating={this.state.sellerScore} // 当前星星数
starSize={} // 星星大小
interItemSpacing={} // 星星之间的间距
valueChanged={(star) => {this.setState({sellerScore: star},() => {console.log(this.state.sellerScore)})}} // 星星数量改变
selectStar={videoVoice} // 选中图片
unSelectStar={videoAudio} // 未选中图片
/>

5.点赞

 //点赞
like(id,isLike) {
Http.postForm('/api/user/find/timeline/like/count', {
id: id,
status:isLike //1点赞,2取消
}).then((res) => {
if (res.status === ) {
if (isLike === ) {
this.setState({
isLike: ,
});
} else {
this.setState({
isLike: ,
});
}
this.getUserInfo() //获取点赞数量
}
})
} getUserInfo() {
Http.postForm('/api/user/userinfo').then(res => {
console.log('获取用户ID',res)
if (res.status === ) {
this.Checklike(this.props.item.ID,res.user.ID)
this.setState({
Userid:res.user.ID
})
}
})
}
//查看动态详情
Checklike(id,Userid) {
Http.postForm('/api/user/find/timeline/detail', {
id,
user_id:Userid
}).then((res) => {
console.log('查看返回信息',res);
if (res.status === ) {
this.setState({
like_number:res.data.like_number,
comment_number:res.data.comment_number,
is_like:res.data.is_like,//1 已点赞 2 没点赞
isLike:res.data.is_like===?:
})
}
})
} // 渲染标签
<Touchable
delayPress={}
style={{
flexDirection: 'row',
alignItems: 'center',
marginRight: ,
}}
onPress={()=>{this.like(item.ID,isLike)}}
>
{is_like === ? <Image source={unstar}/>: <Image source={star} />}
<Text style={{fontSize: , color: '#C1C1C1', marginLeft: ,marginTop: }}>{like_number}</Text>
</Touchable>

6.在数组中跟根据id数组筛选出相同id的对象

大数组.filter(item=>
id数组.filter(e=>e === item.id).length > )

为什么length要大于0呢?

7.颜色渐变代码

 getColor = (bili) => {
//var 百分之一 = (单色值范围) / 50; 单颜色的变化范围只在50%之内
let one = (+) / ;
let r=;
let g=;
let b=; if ( bili < ) {
// 比例小于50的时候红色是越来越多的,直到红色为255时(红+绿)变为黄色.
r = one * bili;
g=;
}
if ( bili >= ) {
// 比例大于50的时候绿色是越来越少的,直到0 变为纯红
g = - ( (bili - ) * one) ;
r = ;
}
r = parseInt(r);// 取整
g = parseInt(g);// 取整
b = parseInt(b);// 取整 return "rgb("+r+","+g+","+b+")"; };

8.生成一周时间

new Array 创建的数组只是添加了length属性,并没有实际的内容。通过扩展后,变为可用数组用于循环

function getWeekTime(){
return [...new Array(7)].map((j,i)=> new Date(Date.now()+i*8.64e7).toLocaleDateString())
}

使用

getWeekTime()
// ["2020/2/26", "2020/2/27", "2020/2/28", "2020/2/29", "2020/3/1", "2020/3/2", "2020/3/3"]

9.类型判断

判断核心使用 Object.prototype.toString,这种方式可以准确的判断数据类型。

/**
* @param {any} target
* @param {string} type
* @return {boolean}
*/
function isType(target, type) {
let targetType = Object.prototype.toString.call(target).slice(, -).toLowerCase()
return targetType === type.toLowerCase()
}

使用

isType([], 'Array') // true
isType(/\d/, 'RegExp') // true
isType(new Date(), 'Date') // true
isType(function(){}, 'Function') // true
isType(Symbol(), 'Symbol') // true

10.对象属性剔除

应用场景很简单,当你需要使用一个对象,但想移除部分属性时,可以使用该方法。同样的,你可以实现一个对象属性选取方法。

/**
* @param {object} object
* @param {string[]} props
* @return {object}
*/
function omit(object, props=[]){
let res = {}
Object.keys(object).forEach(key=>{
if(props.includes(key) === false){
res[key] = typeof object[key] === 'object' && object[key] !== null ?
JSON.parse(JSON.stringify(object[key])):
object[key]
}
})
return res
}

使用

let data = {
id: ,
title: 'xxx',
comment: []
}
omit(data, ['id']) // {title: 'xxx', comment: []} 

11.日期格式化  /或者用moment

一个很灵活的日期格式化函数,可以根据使用者给定的格式进行格式化,能应对大部分场景

/**
* @param {string} format
* @param {number} timestamp - 时间戳
* @return {string}
*/
function formatDate(format='Y-M-D h:m', timestamp=Date.now()){
let date = new Date(timestamp)
let dateInfo = {
Y: date.getFullYear(),
M: date.getMonth()+,
D: date.getDate(),
h: date.getHours(),
m: date.getMinutes(),
s: date.getSeconds()
}
let formatNumber = (n) => n > ? n : '' + n
let res = format
.replace('Y', dateInfo.Y)
.replace('M', dateInfo.M)
.replace('D', dateInfo.D)
.replace('h', formatNumber(dateInfo.h))
.replace('m', formatNumber(dateInfo.m))
.replace('s', formatNumber(dateInfo.s))
return res
}

使用

formatDate() // "2020-2-24 13:44"
formatDate('M月D日 h:m') // "2月24日 13:45"
formatDate('h:m Y-M-D', ) // "14:37 2020-2-24"

extra:

      var formatDateTime = function (date) {

            var y = date.getFullYear();

            var m = date.getMonth() + ;

            m = m <  ? ('' + m) : m;

            var d = date.getDate();

            d = d <  ? ('' + d) : d;

            var h = date.getHours();

            h=h <  ? ('' + h) : h;

            var minute = date.getMinutes();

            minute = minute <  ? ('' + minute) : minute;

            var second=date.getSeconds();

            second=second <  ? ('' + second) : second;

            return y + '-' + m + '-' + d+' '+h+':'+minute+':'+second;

        };

         formatDateTime(new Date()) //2020-05-16 16:03:13

12.性能分析

Web Performance API允许网页访问某些函数来测量网页和Web应用程序的性能

performance.timing 包含延迟相关的性能信息

performance.memory 包含内存信息,是Chrome中添加的一个非标准扩展,在使用时需要注意

window.onload = function(){
setTimeout(()=>{
let t = performance.timing,
m = performance.memory
console.table({
'DNS查询耗时': (t.domainLookupEnd - t.domainLookupStart).toFixed(),
'TCP链接耗时': (t.connectEnd - t.connectStart).toFixed(),
'request请求耗时': (t.responseEnd - t.responseStart).toFixed(),
'解析dom树耗时': (t.domComplete - t.domInteractive).toFixed(),
'白屏时间': (t.responseStart - t.navigationStart).toFixed(),
'domready时间': (t.domContentLoadedEventEnd - t.navigationStart).toFixed(),
'onload时间': (t.loadEventEnd - t.navigationStart).toFixed(),
'js内存使用占比': m ? (m.usedJSHeapSize / m.totalJSHeapSize * ).toFixed() + '%' : undefined
})
})
}

13.防抖

性能优化方案,防抖用于减少函数请求次数,对于频繁的请求,只执行这些请求的最后一次。

基础版本

function debounce(func, wait = ){
let timer = null;
return function(){
if(timer !== null){
clearTimeout(timer);
}
timer = setTimeout(fn,wait);
}
}

改进版本添加是否立即执行的参数,因为有些场景下,我们希望函数能立即执行。

/**
* @param {function} func - 执行函数
* @param {number} wait - 等待时间
* @param {boolean} immediate - 是否立即执行
* @return {function}
*/
function debounce(func, wait = , immediate = false){
let timer, ctx;
let later = (arg) => setTimeout(()=>{
func.apply(ctx, arg)
timer = ctx = null
}, wait)
return function(...arg){
if(!timer){
timer = later(arg)
ctx = this
if(immediate){
func.apply(ctx, arg)
}
}else{
clearTimeout(timer)
timer = later(arg)
}
}
}

使用

let scrollHandler = debounce(function(e){
console.log(e)
}, )
window.onscroll = scrollHandler

14.节流

性能优化方案,节流用于减少函数请求次数,与防抖不同,节流是在一段时间执行一次。

/**
* @param {function} func - 执行函数
* @param {number} delay - 延迟时间
* @return {function}
*/
function throttle(func, delay){
let timer = null
return function(...arg){
if(!timer){
timer = setTimeout(()=>{
func.apply(this, arg)
timer = null
}, delay)
}
}
}

使用

let scrollHandler = throttle(function(e){
console.log(e)
}, )
window.onscroll = scrollHandler

15.base64数据导出文件下载

/**
* @param {string} filename - 下载时的文件名
* @param {string} data - base64字符串
*/
function downloadFile(filename, data){
let downloadLink = document.createElement('a');
if ( downloadLink ){
document.body.appendChild(downloadLink);
downloadLink.style = 'display: none';
downloadLink.download = filename;
downloadLink.href = data;
if ( document.createEvent ){
let downloadEvt = document.createEvent('MouseEvents');
downloadEvt.initEvent('click', true, false);
downloadLink.dispatchEvent(downloadEvt);
} else if ( document.createEventObject ) {
downloadLink.fireEvent('onclick');
} else if (typeof downloadLink.onclick == 'function' ) {
downloadLink.onclick();
}
document.body.removeChild(downloadLink);
}
}

16.检测是否为PC端浏览器

function isPCBroswer() {
let e = window.navigator.userAgent.toLowerCase()
, t = "ipad" == e.match(/ipad/i)
, i = "iphone" == e.match(/iphone/i)
, r = "midp" == e.match(/midp/i)
, n = "rv:1.2.3.4" == e.match(/rv:1.2.3.4/i)
, a = "ucweb" == e.match(/ucweb/i)
, o = "android" == e.match(/android/i)
, s = "windows ce" == e.match(/windows ce/i)
, l = "windows mobile" == e.match(/windows mobile/i);
return !(t || i || r || n || a || o || s || l)
}

17.识别浏览器及平台

function getPlatformInfo(){
//运行环境是浏览器
let inBrowser = typeof window !== 'undefined';
//运行环境是微信
let inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;
let weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();
//浏览器 UA 判断
let UA = inBrowser && window.navigator.userAgent.toLowerCase();
if(UA){
let platforms = {
IE: /msie|trident/.test(UA),
IE9: UA.indexOf('msie 9.0') > ,
Edge: UA.indexOf('edge/') > ,
Android: UA.indexOf('android') > || (weexPlatform === 'android'),
IOS: /iphone|ipad|ipod|ios/.test(UA) || (weexPlatform === 'ios'),
Chrome: /chrome\/\d+/.test(UA) && !(UA.indexOf('edge/') > ),
}
for (const key in platforms) {
if (platforms.hasOwnProperty(key)) {
if(platforms[key]) return key
}
}
}
}

18.休眠函数

   //参数n为休眠时间,单位为毫秒:
function sleep(n) {
var start = new Date().getTime();
console.log('休眠前:' + start);
while (true) {
if (new Date().getTime() - start > n) {
break;
}
}
console.log('休眠后:' + new Date().getTime());
}
function abc(){
  console.log('123')    
sleep(3000)
console.log('222')
}

19.数组去重,返回一个新数组

案例一

function unique(arr){
if(!isArrayLink(arr)){ //不是类数组对象
return arr
}
let result = []
let objarr = []
let obj = Object.create(null) arr.forEach(item => {
if(isStatic(item)){//是除了symbol外的原始数据
let key = item + '_' + getRawType(item);
if(!obj[key]){
obj[key] = true
result.push(item)
}
}else{//引用类型及symbol
if(!objarr.includes(item)){
objarr.push(item)
result.push(item)
}
}
}) return resulte
}

案例二 checkBox 多选框  拼接多个种类

拼接多个数组,分门别类组成一个新的总数组。

    //获取二级策略 访问同一接口多次
_getList(id) {
       //时机为第一个
     if (id == this.props.list[].id) {
this.setState({
loading:window.$message.loading('加载中', )
});
}
HttpUtils.postForm('/api/admin/dm/strategy/list', {
dm_strategy_temp_id: id,
page: ,
pers:
}).then(res => {
if (res.status === ) {
if(res.data.length > ){
this.setState({
data:this.state.data.concat([{fatherId:id,son:res.data}]),
})
}
          //时机为最后一个
if(id == this.props.list[this.props.list.length - ].id){
setTimeout(()=>{
this.setState({
visible:true,
})
this.state.loading()
},)
}
}else {
this.state.loading()
          //时机为最后一个
if(id == this.props.list[this.props.list.length - ].id){
window.$message.warn(res.message);
}
}
}).catch(() => {
this.state.loading()
window.$message.error('通讯失败')
})
}
//checkBox 多选  选了一类二级分类1 ,再去选择二类二级分类1的时候, 一类二级分类1 直接没了(因为这里使用的onChange函数是同一个checkedList)
一类
一类二级分类1
二类
二类二级分类1
//解决办法: 使用组件
//父组件
{
this.props.list && this.props.list.filter(item=>{return item.id !== -1 }).map(items=>(
<CheckedItem onChange={this._getChecklist} ref={(e)=>{this._checkBox = e}} data={this.state.data} items={items} />
    ))
}

CheckedItem.js
render() {
const {items,data} = this.props
return (
<div>
<div className="site-checkbox-all-wrapper">
<Checkbox
onChange={this.onCheckAllChange}
checked={this.state.checkAll}
>
{items.name}
</Checkbox>
</div>
<br />
<CheckboxGroup
options={this.state.plainOptions}
value={this.state.checkedList}
onChange={(e)=>{this.onChange(e,items.id)}}
style={{marginBottom:10}}
/>
</div>
);
}
 

new Map() 函数去重 / 拼接checkedItem组件的值

//数组去重
unique = (arr)=>{
const res = new Map();
return arr.filter((val)=>!res.has(val) && res.set(val,))
}
   _getChecklist = (checkedList,isRemove,val)=>{
const newArr = this.unique(this.state.checkedList.concat(checkedList))
if (isRemove){
for(let i = 0 ; i < newArr.length ; i ++){
if (newArr[i] == val) {
newArr.splice(i,1)
}
}
} this.setState({
checkedList:newArr
})
};

按类别筛选

    componentDidMount() {
const {items,data} = this.props
this.setState({
plainOptions:data.length> && data.filter(item=>{
return item.fatherId === items.id
}).length > && data.filter(item=>{
return item.fatherId === items.id //自己做的数组中的值 fatherId === 8个对象中的id值
})[].son.map(item=>{
return{
label: item.name,
value: item.id
}
})
})
}

删除数组中指定元素 这个例子中不能直接使用,但可以借鉴

//删除数组中指定元素
const a = [,,,,]
Array.prototype.indexOf = function (val) {
for (let i = ; i < a.length ; i ++ ){
console.log('index',i,'val',val)
if(this[i] == val) return i ;
}
return -;
}; Array.prototype.remove = function (val) {
const index = a.indexOf(val)
if(index > -){
this.splice(index,)
console.log('哈哈',this)
}
}; a.remove([])
console.log('让我康康',a) // 30 ,60 120 ,150

借鉴修改的函数

【JS】实用/常用函数/Function方法

includes 函数 检查数组是否含有某元素 是则返回true

//CheckItem中的选择框onChange函数,数组相减获取需要删除的元素

    onChange = (checkedList,id) => {

        console.log('当前',checkedList,'上次',this.state.checkedList)

        if(checkedList.length < this.state.checkedList.length){ //这里说明有的勾选被取消了
this.props.onChange(checkedList,true,this.state.checkedList.filter(el => !checkedList.includes(el)))
console.log('两个数组相减',this.state.checkedList.filter(el => !checkedList.includes(el)))
}else {
this.props.onChange(checkedList)
} this.setState({
checkedList,
indeterminate: !!checkedList.length && checkedList.length < this.state.plainOptions.length,
father:id,
checkAll: checkedList.length === this.state.plainOptions.length,
});
}; //父组件调用删除函数 _getChecklist = (checkedList,isRemove,val)=>{
const newArr = this.unique(this.state.checkedList.concat(checkedList))
if (isRemove){
for(let i = ; i < newArr.length ; i ++){
if (newArr[i] == val) {
newArr.splice(i,)
}
}
} this.setState({
checkedList:newArr
})
};

20.获取Url参数,返回一个对象

function GetUrlParam(){
let url = document.location.toString();
let arrObj = url.split("?");
let params = Object.create(null)
if (arrObj.length > ){
arrObj = arrObj[].split("&");
arrObj.forEach(item=>{
item = item.split("=");
params[item[]] = item[]
})
}
return params;
}
// ?a=1&b=2&c=3 ==> {a: "1", b: "2", c: "3"}

21.禁止键盘事件

document.addEventListener('keydown', function(event){
return !(
== event.keyCode || //F1
== event.keyCode || //F12
event.ctrlKey && == event.keyCode || //ctrl + R
event.ctrlKey && == event.keyCode || //ctrl + N
event.shiftKey && == event.keyCode || //shift + F10
event.altKey && == event.keyCode || //alt + F4
"A" == event.srcElement.tagName && event.shiftKey //shift + 点击a标签
) || (event.returnValue = false)
});

22.禁止 右键/选择/复制

['contextmenu', 'selectstart', 'copy'].forEach(function(ev){
document.addEventListener(ev, function(event){
return event.returnValue = false
})
});

23.交集/并集/去重

    1.求交集
    var arr1 = [{name:'name1',id:1},{name:'name2',id:2},{name:'name3',id:3}];
var arr1Id = [1,2,3]
var arr2 = [{name:'name1',id:1},{name:'name2',id:2},{name:'name3',id:3},{name:'name4',id:4},{name:'name5',id:5}];
var result = arr2.filter(function(v){
return arr1Id.indexOf(v.id)!==-1 // 利用filter方法来遍历是否有相同的元素
})
console.log(result);
      2.求并集
    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 arr3 = arr1.concat(arr2);
let result = [];
var obj = [];
result = arr3.reduce(function(prev, cur, index, arr) {
console.log(prev, cur);
obj[cur.id] ? '' : obj[cur.id] = true && prev.push(cur);
return prev;
}, []);
console.log(result);
3.求差集<br>    let arr1 = [{name:'name1',id:1},{name:'name2',id:2},{name:'name3',id:3}];
let arr1Id = [1,2,3];
let arr2 = [{name:'name1',id:1},{name:'name4',id:4},{name:'name5',id:5}];
let arr2Id = [1,4,5];
let arr3 = arr1.concat(arr2);
let result = arr3.filter(function(v){
return arr1Id.indexOf(v.id)===-1 || (arr2Id.indexOf(v.id)===-1)
})
console.log(result);
      4.去重
    let 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}];
var obj = [];
let result = arr.reduce(function(prev, cur, index, arr) {
console.log(prev, cur);
obj[cur.id] ? '' : obj[cur.id] = true && prev.push(cur);
return prev;
}, []);
去重运用:
 a方法
       let includeThis = false
let vm = this
if(vm.informedPersonList.length>0){
vm.informedPersonList.forEach(el =>{
if(el.id == vm.selectedTrueItem.id){
includeThis = true
}
})
}
if(includeThis===false){
vm.informedPersonList.push(vm.selectedTrueItem)
}else{
Message({message: '请勿重复添加',type: 'warning'})
}
 b方法(必须先let informedPersonL = vm.informedPersonList,不能直接使用vm.informedPersonList,否则浏览器控制台会报错) vm.informedPersonList.push(this.selectedTrueItem)
let obj = {};
let informedPersonL = vm.informedPersonList
informedPersonL = informedPersonL.reduce((cur,next) => {
obj[next.id] ? "" : obj[next.id] = true && cur.push(next);
return cur;
},[]) //设置cur默认类型为数组,并且初始值为空的数组
vm.selectedTrueItem = {}
vm.$emit("backInformedPList",informedPersonL);

24.删除数组对象中相同的对象

       deteleObject = (obj) =>{
var uniques = [];
var stringify = {};
for (var i = 0; i < obj.length; i++) {
var keys = Object.keys(obj[i]);
keys.sort(function(a, b) {
return (Number(a) - Number(b));
});
var str = '';
for (var j = 0; j < keys.length; j++) {
str += JSON.stringify(keys[j]);
str += JSON.stringify(obj[i][keys[j]]);
}
if (!stringify.hasOwnProperty(str)) {
uniques.push(obj[i]);
stringify[str] = true;
}
}
uniques = uniques;
return uniques;
}
const obj = [
{name:'1',url:'a'},
{name:'1',url:'a'},
{name:'2',url:'b'},
]
console.log('让我康康',this.deteleObject(obj))

25.JS 阿拉伯数字与中文数字互转

var chnUnitSection = ["","万","亿","万亿","亿亿"]; //阿拉伯数字转中文数字用
var chnUnitChar = ["","十","百","千"]; //阿拉伯数字转中文数字用
var chnNumChar = ["零","一","二","三","四","五","六","七","八","九"]; //两个都要用到
var chnNameValue = { //中文数字转阿拉伯数字作用
    ChineseToNumber(chnStr){
var rtn = 0;
var section = 0;
var number = 0;
var secUnit = false;
var str = chnStr.split(''); for(var i = 0; i < str.length; i++){
var num = chnNumChar[str[i]];
if(typeof num !== 'undefined'){
number = num;
if(i === str.length - 1){
section += number;
}
}else{
var unit = chnNameValue[str[i]].value;
secUnit = chnNameValue[str[i]].secUnit;
if(secUnit){
section = (section + number) * unit;
rtn += section;
section = 0;
}else{
section += (number * unit);
}
number = 0;
}
}
return rtn + section;
} SectionToChinese(section){
var strIns = '', chnStr = '';
var unitPos = 0;
var zero = true;
while(section > 0){
var v = section % 10;
if(v === 0){
if(!zero){
zero = true;
chnStr = chnNumChar[v] + chnStr;
}
}else{
zero = false;
strIns = chnNumChar[v];
strIns += chnUnitChar[unitPos];
chnStr = strIns + chnStr;
}
unitPos++;
section = Math.floor(section / 10);
}
return chnStr;
} NumberToChinese = (num)=>{
var unitPos = 0;
var strIns = '', chnStr = '';
var needZero = false; if(num === 0){
return chnNumChar[0];
} while(num > 0){
var section = num % 10000;
if(needZero){
chnStr = chnNumChar[0] + chnStr;
}
strIns = this.SectionToChinese(section);
strIns += (section !== 0) ? chnUnitSection[unitPos] : chnUnitSection[0];
chnStr = strIns + chnStr;
needZero = (section < 1000) && (section > 0);
num = Math.floor(num / 10000);
unitPos++;
} return chnStr;
}

26.科学计数法转化为数字

function toFixed(x) {
if (Math.abs(x) < 1.0) {
var e = parseInt(x.toString().split('e-')[]);
if (e) {
x *= Math.pow(,e-);
x = '0.' + (new Array(e)).join('') + x.toString().substring();
}
} else {
var e = parseInt(x.toString().split('+')[]);
if (e > ) {
e -= ;
x /= Math.pow(,e);
x += (new Array(e+)).join('');
}
}
return x;
}

27.时间戳转化为日期

    var dateFormat = function (timestamp, formats) {
// formats格式包括
// 1. Y-m-d
// 2. Y-m-d H:i:s
// 3. Y年m月d日
// 4. Y年m月d日 H时i分
formats = formats || 'Y-m-d'; var zero = function (value) {
if (value < ) {
return '' + value;
}
return value;
}; var myDate = timestamp? new Date(timestamp): new Date(); var year = myDate.getFullYear();
var month = zero(myDate.getMonth() + );
var day = zero(myDate.getDate()); var hour = zero(myDate.getHours());
var minite = zero(myDate.getMinutes());
var second = zero(myDate.getSeconds()); return formats.replace(/Y|m|d|H|i|s/ig, function (matches) {
return ({
Y: year,
m: month,
d: day,
H: hour,
i: minite,
s: second
})[matches];
});
}; console.log('date',dateFormat(,'Y年m月d日 H时i分')) // 2020年05月13日 18时22分

28.自动分隔手机号

【JS】实用/常用函数/Function方法

    $("#mobilePhone").keyup(function(){
let text_len = this.value.length;
if ((text_len === || text_len === ) && window.event.keyCode !== ) {
this.value += " ";
} });
//表单验证替换空格
const tel = $('#mobilePhone').val().replace(/\s*/g,"");

29.textarea高度自适应

$.fn.autoHeight = function(){
function autoHeight(elem){
elem.style.height = 'auto';
elem.scrollTop = ; //防抖动
elem.style.height = elem.scrollHeight + 'px';
}
this.each(function(){
autoHeight(this);
$(this).on('keyup', function(){
autoHeight(this);
});
});
};
$('textarea[autoHeight]').autoHeight();

直接在textarea标签上添加 autoHeight='true' 即可

【JS】实用/常用函数/Function方法

30.jQuery点击空白处关闭弹窗

    $(document).mouseup(function(e){
var _con=$('目标区域');//设置目标区域
if(!_con.is(e.target)&&_con.has(e.target).length===){//Mark1
$('.confirm-info').addClass('hidden')
$('.confirm-box').addClass('hidden')
}
});

经过测试,在移动端Iphone手机上点击页面空白处弹出层关闭失效,不支持document写法,解决方案:可以添加一个背景层作为页面空白对象处理。  (用main替代document)

       $('.main').mouseup(function(e){
if(!con.is(e.target)&& con.has(e.target).length === ){
con.addClass('hidden')
$('.main').addClass('hidden') }
})

然后又发现了一个问题 ios系统点击会有灰色背景出现,解决方法:

html,body{
-webkit-text-size-adjust: %;
-webkit-tap-highlight-color: rgba(,,,);
}

CSS3 鲜为人知的属性-webkit-tap-highlight-color的理解

(一)-webkit-tap-highlight-color
        这个属性只用于iOS (iPhone和iPad)。当你点击一个链接或者通过Javascript定义的可点击元素的时候,它就会出现一个半透明的灰色背景。要重设这个表现,你可以设置-webkit-tap-highlight-color为任何颜色。
想要禁用这个高亮,设置颜色的alpha值为0即可。
示例:设置高亮色为50%透明的红色:
-webkit-tap-highlight-color: rgba(255,0,0,0.5);
浏览器支持: 只有iOS(iPhone和iPad).
(二)css3中-webkit-text-size-adjust详解:      

1、当样式表里font-size<12px时,中文版chrome浏览器里字体显示仍为12px,这时可以用 html{-webkit-text-size-adjust:none;}

2、-webkit-text-size-adjust放在body上会导致页面缩放失效

3、body会继承定义在html的样式

4、用-webkit-text-size-adjust不要定义成可继承的或全局的

(三)outline:none(1)在pc端为a标签定义这个样式的目的是为了取消ie浏览器下点击a标签时出现的虚线。ie7及以下浏览器还不识别此属性,需要在a标签上添加hidefocus="true"(2)input,textarea{outline:none}  取消chrome下默认的文本框聚焦样式(3)在移动端是不起作用的,想要去除文本框的默认样式可以使用-webkit-appearance,聚焦时候默认样式的取消是-webkit-tap-highlight-color。看到一些移动端reset文件加了此属性,其实是多余。

(四)webkit-appearance   -webkit-appearance: none;   //消除输入框和按钮的原生外观,在iOS上加上这个属性才能给按钮和输入框自定义样式 。   注意:不同type的input使用这个属性之后表现不一。text、button无样式,radio、checkbox直接消失
(五).-webkit-user-select   -webkit-user-select: none; // 禁止页面文字选择 ,此属性不继承,一般加在body上规定整个body的文字都不会自动调整
(六)-webkit-touch-callout   -webkit-touch-callout:none;  // 禁用长按页面时的弹出菜单(iOS下有效) ,img和a标签都要加