分享几个js中的函数

Object.keys()

首先这个函数是用来干嘛的呢?是用来把一个json字符串里的key全都取出来重新整成一个数组的方法,那么这个函数怎么用呢,接下来贴出我最近碰见的用法:

let groups={"key1":'value1',"key2":'value2',"key3":'value3',"key4":'value4',"key5":'value5'}
Object.keys(groups)//[ 'key1', 'key2', 'key3', 'key4', 'key5' ]

这有什么应用场景呢?我觉得这个可以用来遍历一个json对象的所有值,就比如:

let groups={"key1":'value1',"key2":'value2',"key3":'value3',"key4":'value4',"key5":'value5'}
let key=Object.keys(groups)//[ 'key1', 'key2', 'key3', 'key4', 'key5' ]
key.forEach(function(item){
console.log(groups[item]) ;
})
/*结果如下:
value1
value2
value3
value4
value5
*/

当然这样还不够,我们还能它和另一个函数结合使用,生成一个只有value,没有key的数组

array.map()

 map()函数又是用来干嘛的呢?据我了解,我个人认为它就是一个可以帮我们把一个数组重新组装成我们想要的样子的一个函数,接下来先解决一下上面留下的问题,用groups中的所有value组成一个新的数组

let groups={"key1":'value1',"key2":'value2',"key3":'value3',"key4":'value4',"key5":'value5'};
let data=Object.keys(groups).map(function(item){
return groups[item];
});
console.log(data);
//结果:[ 'value1', 'value2', 'value3', 'value4', 'value5' ]

当然,这么一个案例还体现不出它的妙用,那么再来一个:

let datas=[
[
{"Date":"周一","money":100,"name":"xyz"},
{"Date":"周二","money":200,"name":"xyz"},
{"Date":"周三","money":300,"name":"xyz"},
{"Date":"周四","money":400,"name":"xyz"},
{"Date":"周五","money":500,"name":"xyz"}
],
[
{"Date":"周一","money":300,"name":"xz"},
{"Date":"周二","money":2100,"name":"xz"},
{"Date":"周三","money":500,"name":"xz"},
{"Date":"周四","money":400,"name":"xz"},
{"Date":"周五","money":100,"name":"xz"}
],
[
{"Date":"周一","money":300,"name":"df"},
{"Date":"周二","money":2100,"name":"df"},
{"Date":"周三","money":400,"name":"df"},
{"Date":"周四","money":300,"name":"df"},
{"Date":"周五","money":1200,"name":"df"}
]
]; let result=datas.map(function(item){
let sumMoney=0;
item.forEach(function(i){
sumMoney+=i["money"];
});
return [item[0]["name"],sumMoney]
}) console.log(result);
/*
结果为[['xyz', 1500],['xz', 3400],['df', 4300]]
*/

在看着个函数的时候不知道你是否想到了forEach()这个变脸array的函数,你别说,他俩还挺像的

let result=datas.map(function(item){
let sumMoney=0;
item.forEach(function(i){
sumMoney+=i["money"];
});
return [item[0]["name"],sumMoney]
})
console.log(result);//[Array(2), Array(2), Array(2)] result= datas.forEach(function(item){
let sumMoney=0;
item.forEach(function(i){
sumMoney+=i["money"];
});
return sumMoney;
});
console.log(result);//undefined

从这个例子中我们可以看出,map能把return的值都保存到一个数组中,而forEach不可以

当然也可以换种写法,比如把forEach下面这样,就能实现map的功能:

let result2=[]
datas.forEach(function(item){
let sumMoney=0;
item.forEach(function(i){
sumMoney+=i["money"];
});
result2.push([item[0]["name"],sumMoney])
});
console.log(result2);//[Array(2), Array(2), Array(2)]

groupBy()

然后再分享一个大佬写的groupBy函数,我觉得用的就很巧妙,代码如下:

let datas=[
{"Date":"周一","money":100,"name":"xyz"},
{"Date":"周一","money":300,"name":"xz"},
{"Date":"周五","money":500,"name":"xyz"},
{"Date":"周四","money":300,"name":"df"},
{"Date":"周二","money":2100,"name":"xz"},
{"Date":"周二","money":200,"name":"xyz"},
{"Date":"周五","money":100,"name":"xz"},
{"Date":"周三","money":300,"name":"xyz"},
{"Date":"周一","money":300,"name":"df"},
{"Date":"周三","money":500,"name":"xz"},
{"Date":"周二","money":2100,"name":"df"},
{"Date":"周四","money":400,"name":"xz"},
{"Date":"周三","money":400,"name":"df"},
{"Date":"周四","money":400,"name":"xyz"},
{"Date":"周五","money":1200,"name":"fd"}
]; //创建groupBy函数
function groupBy(arrays,fun){
let groups={};
arrays.forEach(function(array){
let group=JSON.stringify(fun(array));
groups[group]=groups[group] || [];
groups[group].push(array);
});
return Object.keys(groups).map(function(group){
return groups[group]
})
}; //使用groupBy函数
let result=groupBy(datas,function(item){
return item.name; //根据name分组
});
console.log(result);

运行结果为:

call()和apply()

这两个函数都能改变一个函数中的this对象的指向,具体请看如下案例:

/*
* call()和apply()
* - 这两个方法都是函数对象的方法,需要通过函数对象来调用
* - 当对函数调用call()和apply()都会调用函数执行
* - 在调用call()和apply()可以将一个对象指定为第一个参数
* 此时这个对象将会成为函数执行时的this
* - call()方法可以将实参在对象之后依次传递
* - apply()方法需要将实参封装到一个数组中统一传递
*
* - this的情况:
* 1.以函数形式调用时,this永远都是window
* 2.以方法的形式调用时,this是调用方法的对象
* 3.以构造函数的形式调用时,this是新创建的那个对象
* 4.使用call和apply调用时,this是指定的那个对象
*/
function fun(a,b) {
console.log("a = "+a);
console.log("b = "+b);
alert(this);
} var obj = {
name: "obj",
sayName:function(){
alert(this.name);
}
}; var obj2 = {
name: "obj2"
}; //fun(); this==> Window
// fun.call(); this==> Window
// fun.apply(); this==>window
// fun.apply(obj,[2,3]);//this==> obj <==> fun.call(obj,2,3);
// fun.call(obj); this==> obj <===> fun.apply(obj);
//obj.sayName.apply(obj2); this==> obj2 ==> alert('obj2')

此次分享到此结束~~

js中的Object.keys、array.map、groupBy、call、apply总结分享的更多相关文章

  1. Array.from();Object.keys();Array.map()

    Array.from():方法从一个类似数组或可迭代对象创建一个新的数组形式: const bar = ["a", "b", "c"]; A ...

  2. [JS高程]引用类型(Object、Array)

    引用类型:Object.Array Object: person.name   =>推荐,除非必须使用变量([])来表示 person["name"] 区别:[]可以通过变量 ...

  3. js 中调用 Object.prototype.toString()来检测对象的类型

    1.使用toString()方法来检测对象类型 可以通过toString() 来获取每个对象的类型.为了每个对象都能通过 Object.prototype.toString() 来检测,需要以 Fun ...

  4. js中的Object.defineProperty()和defineProperties()详解

    ECMAS-262第5版在定义只有内部采用的特性时,提供了描述了属性特征的几种属性.ECMAScript对象中目前存在的属性描述符主要有两种,数据描述符(数据属性)和存取描述符(访问器属性),数据描述 ...

  5. js中对Object对象的一些常用操作总结

    前言我前面的文章,写过js中“类”与继承的一些文章.ES5我们可以通过 构造函数 或者 Object.create()等方式来模拟出js中的“类”,当然,对象呢是类的实例化,我们可以通过如下方式创建对 ...

  6. 011——VUE中使用object与array控制class

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. Js中的Object.defineProperty

    通过Object.defineProperty为对象设置属性,并同时规定属性的属性(可见性,可配置性,可枚举性等) 备注:如果通过var obj = {} obj.age = 18这种方式设置的属性, ...

  8. js中常用的对象—Array的属性和方法

    今天说一下,js中常用的内置对象——Array对象 Array常用属性: length prototype :给系统对象添加属性和方法 Array常用方法: Array.prototype.sum = ...

  9. js中的Object.assign接受两个函数为参数的时候会发生什么?

    缘由 今天看到一段代码 return Object.assign(func1, func2); 心生疑惑,为什么 Object.assign 的参数可以是函数? 于是有了下面这一堆东西,其实都是老生常 ...

  10. 通过日期在js中求出判断间隔天数,周期等实现分享

    在我们在项目的时候,可能出现这样的一种情况,有一个开始时间和一个结束时间,而这两个时间用$('#StartTime').val(); 取出来的时候又是datetime 类型,我们需要求这个时间中的间隔 ...

随机推荐

  1. A-深度学习面试题

    目录 目录 一,滤波器与卷积核 二,卷积层和池化输出大小计算 2.1,CNN 中术语解释 2.2,卷积输出大小计算(简化型) 2.3,理解边界效应与填充 padding 参考资料 三,深度学习框架的张 ...

  2. js文字无限循环向上滚动

    html代码 <div id="scroll"> <div id="con1"> <p style="color: re ...

  3. 一文带你快速入门 Go 语言微服务开发 - Dubbo Go 入门实践总结

    更多详细示例可直接访问 Dubbo 官网 或搜索关注官方微信公众号:Apache Dubbo 1. 安装Go语言环境 建议使用最新版 go 1.17 go version >= go 1.15 ...

  4. Flink SQL管理平台flink-streaming-platform-web安装搭建

    文章都在个人博客网站:https://www.ikeguang.com/ 同步,欢迎访问. 最近看到有人在用flink sql的页面管理平台,大致看了下,尝试安装使用,比原生的flink sql界面确 ...

  5. Django的manytomany字段

    manytomany字段 用于表示多对多的关系,最常见的就是老师和班级的例子 一个老师可以教多个班级,一个班级也可以有多个老师 add 添加关系 teachers=models.Teacher.obj ...

  6. Springboot配置多Redis源

    Springboot配置多Redis源 一.背景 因项目部署了新集群,某些缓存数据需要在旧的redis上取,就必须配置多个数据源动态获取相对应的源以兼容业务. 二.配置依赖 <dependenc ...

  7. conan环境安装

    环境 安装conan 使用conan 搜索包 导入包 编译 打包项目 准备源码 编译成conan包 环境 ubuntu:bionic的docker image docker run -it ubunt ...

  8. 数据库日志——binlog、redo log、undo log扫盲

    日志是数据库中比较重要的组成部分,很多核心的功能必须依靠日志才能完成. 该篇文章简要介绍了binlog.redo log与undo log,能够在一定程度上拓宽对mysql日志的整体认识. binlo ...

  9. DVWA靶场——靶场搭建

    DVWA靶场搭建 一.phpstudy环境准备: 第一步:下载PHPstudy: 找到PHPstudy官网,下载windows版小皮面板,然后安装.官网下载地址:https://www.xp.cn/ ...

  10. Java学习笔记:2022年1月13日(其一)

    Java学习笔记:2022年1月13日(其一) ​ 摘要:这篇笔记主要讲解了Java中的自定义类.以及构造一个类时所需要了解的一些重点知识. 目录 Java学习笔记:2022年1月13日(其一) 1. ...