js中的Object.keys、array.map、groupBy、call、apply总结分享
分享几个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总结分享的更多相关文章
- Array.from();Object.keys();Array.map()
Array.from():方法从一个类似数组或可迭代对象创建一个新的数组形式: const bar = ["a", "b", "c"]; A ...
- [JS高程]引用类型(Object、Array)
引用类型:Object.Array Object: person.name =>推荐,除非必须使用变量([])来表示 person["name"] 区别:[]可以通过变量 ...
- js 中调用 Object.prototype.toString()来检测对象的类型
1.使用toString()方法来检测对象类型 可以通过toString() 来获取每个对象的类型.为了每个对象都能通过 Object.prototype.toString() 来检测,需要以 Fun ...
- js中的Object.defineProperty()和defineProperties()详解
ECMAS-262第5版在定义只有内部采用的特性时,提供了描述了属性特征的几种属性.ECMAScript对象中目前存在的属性描述符主要有两种,数据描述符(数据属性)和存取描述符(访问器属性),数据描述 ...
- js中对Object对象的一些常用操作总结
前言我前面的文章,写过js中“类”与继承的一些文章.ES5我们可以通过 构造函数 或者 Object.create()等方式来模拟出js中的“类”,当然,对象呢是类的实例化,我们可以通过如下方式创建对 ...
- 011——VUE中使用object与array控制class
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Js中的Object.defineProperty
通过Object.defineProperty为对象设置属性,并同时规定属性的属性(可见性,可配置性,可枚举性等) 备注:如果通过var obj = {} obj.age = 18这种方式设置的属性, ...
- js中常用的对象—Array的属性和方法
今天说一下,js中常用的内置对象——Array对象 Array常用属性: length prototype :给系统对象添加属性和方法 Array常用方法: Array.prototype.sum = ...
- js中的Object.assign接受两个函数为参数的时候会发生什么?
缘由 今天看到一段代码 return Object.assign(func1, func2); 心生疑惑,为什么 Object.assign 的参数可以是函数? 于是有了下面这一堆东西,其实都是老生常 ...
- 通过日期在js中求出判断间隔天数,周期等实现分享
在我们在项目的时候,可能出现这样的一种情况,有一个开始时间和一个结束时间,而这两个时间用$('#StartTime').val(); 取出来的时候又是datetime 类型,我们需要求这个时间中的间隔 ...
随机推荐
- Spring校验器实例
@size (min=3, max=20,message="用户名长度只能在3-20之间") @size (min=6, max=20,message="密码长度只能在6 ...
- Swing常用窗体
Swing常用窗体 Swing 主要具有以下特点: ( 1 )轻量级组件. ( 2 )可插入外观组件. 窗体作为Swing的应用程序中组件的承载体,处于非常重要的地位.Swing中常用的窗体包括JFr ...
- windows error LNK2019
温馨提示,请使用ctrl+F进行快速查找 ws2_32.lib error LNK2001: 无法解析的外部符号 __imp_htons error LNK2001: 无法解析的外部符号 __imp_ ...
- 如何在 K8S 集群范围使用 imagePullSecret?
在这篇文章中,我将向你展示如何在 Kubernetes 中使用 imagePullSecrets. imagePullSecrets 简介 Kubernetes 在每个 Pod 或每个 Namespa ...
- Ubuntu20.04更换国内镜像源(阿里、网易163、清华、中科大)
更换方法 Ubuntu采用apt作为软件安装工具,其镜像源列表记录在/etc/apt/source.list文件中. 首先将source.list复制为source.list.bak备份,然后将sou ...
- 【Java】【数据库】索引为何使查询变得更快?--B+树
排序数据的二分查找 二分查找的时间复杂度是\(O(log_2n)\),明显快于暴力搜索. 索引 建立索引的数据,就是通过事先排好顺序,在查找时可以应用二分查找来提高查询效率. 所以索引应该尽可能建立在 ...
- vue中单独封装elementui中的Dialog弹框组件
一.在components文件中新建 弹框组件 <template> <div> <el-dialog title="提示" :visible.syn ...
- 模型驱动设计的构造块(下)——DDD
3. 领域对象的生命周期 每个对象都有生命周期,如下图所示.对象自创建后,可能会经历各种不同的状态,直至最终消亡--要么存档,要么删除.当然很多对象是简单的临时对象,仅通过调用构造函数来创建,用来做一 ...
- js鼠标轨迹特效
今天无意中访问到了开源社区 (apiopen.top)的主界面,发现鼠标跟随的特效不错(残留轨迹),弄下来玩玩 上代码 整合后只需要两部分,导入JS依赖后,在html 添加 id 为 mouseCan ...
- 《机器人SLAM导航核心技术与实战》第1季:第4章_机器人传感器
<机器人SLAM导航核心技术与实战>第1季:第4章_机器人传感器 视频讲解 [第1季]4.第4章_机器人传感器-视频讲解 [第1季]4.1.第4章_机器人传感器_惯性测量单元-视频讲解 [ ...