分享几个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. dp状态设计

    迎接仪式 题目描述 LHX 教主要来 X 市指导 OI 学习工作了.为了迎接教主,在一条道路旁,一群"Orz 教主 er"穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字.一 ...

  2. 修改Listen 1源码的一点心得

    注:本文只作为技术交流 首先感谢听1的作者写出这么强大的音乐播放器!! 软件首页地址:点击打开链接 软件的github上上上地址:点击打开链接 软件唯一让我美中不足的就是不能下载,这可能是作者考虑到了 ...

  3. 数电第二周总结_by_yc

    数电第二周总结_CC 重点: 模块实例化.仿真测试.数值表示.参数.表达式. 模块实例化端口连接方法: A.顺序端口连接:需严格按照模块定义时的顺序 B.明明端口连接:对端口信号顺序不做要求 Ex-1 ...

  4. 【数据库】在公司开发过程中总结的SQL编写规范,参考开发手册

    〇.概述 1.常用资料链接 (1)阿里巴巴开发手册 链接:https://pan.baidu.com/s/1OtOFuItDIP7nchfODGIZwg?pwd=htx0 提取码:htx0 2.包含内 ...

  5. Cookie添加方法

    Cookie是通过response对象中的getCookie()方法进行获得的

  6. [数学建模]层次分析法AHP

    评价类问题. 问题: ① 评价的目标? ② 可选的方案? ③ 评价的指标? 分层 目标层.准则层.方案层 层次分析法可分为四个步骤建立: 第一步:标度确定和构造判断矩阵: 第二步:特征向量,特征根计算 ...

  7. 自定义RBAC(5)

    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 把实体类及Service类都准备好了之后,就可以开始继续写业务代码了.Spring Security的强大之一就在于它的拦截器.那么这里也可以参 ...

  8. java逻辑运算中异或^

    本文主要阐明逻辑运算符^(异或)的作用 a ^ b,相异为真,相同为假. 注意,异或运算,还能交换两个变量. int a = 1; int b = 2; System.out.println(&quo ...

  9. 手把手教你一套完善且高效的k8s离线部署方案

    作者:郝建伟 背景 面对更多项目现场交付,偶而会遇到客户环境不具备公网条件,完全内网部署,这就需要有一套完善且高效的离线部署方案. 系统资源 编号 主机名称 IP 资源类型 CPU 内存 磁盘 01 ...

  10. uniapp 微信小程序自己封装头部标题栏

    一.首先要关闭原生导航栏 :在pages.json 中设置  "navigationStyle":"custom" 二.在APP.vue中 onLaunch: ...