underscoreJs中pluck函数的源码解析
9月份之后项目开始进入收尾期了,产品要上市,所以9月之后的两个月都在疯狂的改BUG。最近总算是基本结束了,只剩下扫尾的了。终于能静下心来好好研究技术了。最近遇到两个函数,分别是underscore中的where和pluck函数,在对多层次的Json对象中使用这两个函数时,出现了问题。
当时的json对象是这样的结构:
{A:1,B:2,C:{C1:1,C2:2,}D:4
};
先补充一下pluck函数的作用。undescore官网对它们的描述是这样的:
pluck_.pluck(list, propertyName)
A convenient version of what is perhaps the most common use-case for map: extracting a list of property values.var stooges = [{name: 'moe', age: 40}, {name: 'larry', age: 50}, {name: 'curly', age: 60}];
_.pluck(stooges, 'name');
=> ["moe", "larry", "curly"]
当时我需要在由如上结构的json对象中组成的数组对象去进行筛选。但是对于多层次的json对象我并不是很清楚,经过几番试验,终于明白了在这样的情况下如何去使用这两个函数。
var list = [{name:1, age:2, record:{math:2, english:3}}, {name:2, age:3, record:{math:3, english:4}}, {name:3, age:4, record:{math:4, english:5}}];//_.where(list, obj);//_.pluck(list, propertyName)
_.pluck(list, ["record", "english"]);
//console:[3, 4, 5];
官网上对pluck函数的描述是这样的:Convenience version of a common use case of map: fetching a property.简单来说,pluck函数是map函数的一种简单使用版本。源码是这样的:
_.pluck = function(obj, key) {return _.map(obj, _.property(key));};
从上面的代码可以看出pluck函数实际上是map函数的一种运用。
下面就来更加深入地剖析一下pluck函数。
_.property = function(path) {
if (!_.isArray(path)) {return shallowProperty(path);
}
return function(obj) {return deepGet(obj, path);};
};
property函数检验传入的参数是数组还是对象。
如果不是数组的话,返回shallowProperty函数。
是数组的话,返回deepGet函数。
var shallowProperty = function(key) {
return function(obj) {return obj == null ? void 0 : obj[key];
};
};var deepGet = function(obj, path) {var length = path.length;for (var i = 0; i < length; i++) {if (obj == null) return void 0;obj = obj[path[i]];}return length ? obj : void 0;};
观察上面两个函数实际上,最后还是将多层次的函数以数组的形式传入,但是实质上还是以多层次的对象形式进行解析的。
假设是需要匹配的是单层json对象的话,是这样的一个过程:
var list = [{name:1, age:2, record:{math:2, english:3}}, {name:2, age:3, record:{math:3, english:4}}, {name:3, age:4, record:{math:4, english:5}}];//单层次Json对象匹配
//shadowProperty
shadowProperty(obj, "name"){//obj就是List数组对象的迭代return obj == null? void 0: obj["name"];
//分别是[{name:1, age:2, record:{math:2, english:3}["name"], {name:2, age:3, record:{math:3, english:4}}["name"], {name:3, age:4, record:{math:4, english:5}}["name"]]
}最后的值为数组[1,2,3]
而需要匹配的对象是多层json对象的话,实际上就是在单层的基础上多进行了几次遍历取值。大家有兴趣可以自己理解一下,在这里我就不多费篇幅介绍了。
underscoreJs中pluck函数的源码解析相关推荐
- java if中的continue_java中break和continue源码解析
在自己学习java语言的过程中,很容易把break和continue的用法混淆.为了便于以后快速查阅及温习,在此特留学习笔记一份. 简述 在任何迭代语句的主体部分,都可以用break和continue ...
- callback函数_Nodejs 源码解析 util.promisify 如何将 Callback 转为 Promise
Nodejs util 模块提供了很多工具函数.为了解决回调地狱问题,Nodejs v8.0.0 提供了 promisify 方法可以将 Callback 转为 Promise 对象. 工作中对于一些 ...
- bind函数polyfill源码解析
准备知识 使用new来调用函数会自动执行下面的操作: 创建一个全新的对象 这个新对象会被执行原型连接 这个新对象会绑定到函数调用的this 如果函数没有返回其他对象,那么new表达式中的函数调用会自动 ...
- HBase中MemStore flush的源码解析
flush请求的发出: HRegion会调用requestFlush()触发flush行为,flush发生在每一处region可能发生变化的地方,包括region有新数据写入,客户端调用了put/in ...
- java的resize函数_Java源码解析HashMap的resize函数
hashmap的resize函数,用于对hashmap初始化或者扩容. 首先看一下该函数的注释,如下图.从注释中可以看到,该函数的作用是初始化或者使table的size翻倍.如果table是null, ...
- QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者"tingsking18"和主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口程序.消 ...
- cvHoughLines2霍夫直线检测函数详解及源码解析
转载请注明出处. 文章链接:https://blog.csdn.net/duiwangxiaomi/article/details/126406184 博文目录 一. 前言 二. cvHoughLin ...
- php的lumen框架,Lumen框架“服务容器”源码解析
1.服务容器 "服务容器"是Lumen框架整个系统功能调度配置的核心,它提供了整个框架运行过程中的一系列服务."服务容器"就是提供服务(服务可以理解为系统运行中 ...
- AsyncTask源码解析,你需要摸清的细节
AsyncTask简介 1. AsyncTask提供了一种恰当的简单的跟UI Thread交互的方式. 2. 它不需要通过操控Threads或Handler就可以将后台操作以及其结果展示在UI Thr ...
最新文章
- 安装oracle后在cmd,在WINDOWS上安装ORACLE RAC的注意事项
- 动态加载laydate 失效_Java对象的内存布局+反射的原理+动态代理+ 并发和锁+文末彩蛋...
- java 输出字符串的所有排列_JAVA 输出指定字符串所有排列组合
- 呼叫前转业务在VoIP系统中的实现
- Ceph (2) - 安装Ceph集群方法 2:使用cephadm配置Nautilus版Ceph集群
- 鸿蒙OS比fuchsia的优势,第一天带你走进华为开发者大会,了解鸿蒙OS
- XCode插件因为升级不能用了怎么办?几个步骤教你搞定
- 基于STM32单片机的智能药盒定时提示吃药喂水蓝牙APP方案原理图设计
- 怎样挑选鱼头 鱼头怎么做好吃
- nihao, woshi mr jhon
- JAVA图片裁剪上传实例______软件开发-帮助类
- JavaSE总结知识点 重要的点(并不是详细的教材语录)
- 【实习日记】实习第N天 从零开始搭建一个tiktok puppet(一)
- OpenCV图像阈值
- Error:All flavors must now belong to a named flavor dimension. Learn more at
- 第七章——数据库设计
- puppy linux php,硬盘/U盘安装Puppy Linux方法
- 金融机构电子签应用汇总:覆盖7类组织的30多种签署需求
- ubuntu/lubuntu/kubuntu/xubuntu各版本镜像下载地址
- 今年专科计算机分数线,全国31省市2017年高考录取分数线最新汇总
热门文章
- Gradle 实现 Android 多渠道定制化打包
- Js勾选同意协议教程-更新篇
- 前端——列表、表格、表单
- day1 -- ELMO语言模型
- 计算机系统是日语,如何在计算机系统中添加日语输入法
- python清华大学出版社答案_清华大学出版社的这本Python入门书,出版8年 仍经久不衰...
- python pandas处理excel 统计数据_python使用pandas处理excel数据
- UnityAR-平面检测
- C++_基础1.1初识——Hellow world
- imgareaselect+php实现图片裁剪保存