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函数的源码解析相关推荐

  1. java if中的continue_java中break和continue源码解析

    在自己学习java语言的过程中,很容易把break和continue的用法混淆.为了便于以后快速查阅及温习,在此特留学习笔记一份. 简述 在任何迭代语句的主体部分,都可以用break和continue ...

  2. callback函数_Nodejs 源码解析 util.promisify 如何将 Callback 转为 Promise

    Nodejs util 模块提供了很多工具函数.为了解决回调地狱问题,Nodejs v8.0.0 提供了 promisify 方法可以将 Callback 转为 Promise 对象. 工作中对于一些 ...

  3. bind函数polyfill源码解析

    准备知识 使用new来调用函数会自动执行下面的操作: 创建一个全新的对象 这个新对象会被执行原型连接 这个新对象会绑定到函数调用的this 如果函数没有返回其他对象,那么new表达式中的函数调用会自动 ...

  4. HBase中MemStore flush的源码解析

    flush请求的发出: HRegion会调用requestFlush()触发flush行为,flush发生在每一处region可能发生变化的地方,包括region有新数据写入,客户端调用了put/in ...

  5. java的resize函数_Java源码解析HashMap的resize函数

    hashmap的resize函数,用于对hashmap初始化或者扩容. 首先看一下该函数的注释,如下图.从注释中可以看到,该函数的作用是初始化或者使table的size翻倍.如果table是null, ...

  6. QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数

    版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者"tingsking18"和主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口程序.消 ...

  7. cvHoughLines2霍夫直线检测函数详解及源码解析

    转载请注明出处. 文章链接:https://blog.csdn.net/duiwangxiaomi/article/details/126406184 博文目录 一. 前言 二. cvHoughLin ...

  8. php的lumen框架,Lumen框架“服务容器”源码解析

    1.服务容器 "服务容器"是Lumen框架整个系统功能调度配置的核心,它提供了整个框架运行过程中的一系列服务."服务容器"就是提供服务(服务可以理解为系统运行中 ...

  9. AsyncTask源码解析,你需要摸清的细节

    AsyncTask简介 1. AsyncTask提供了一种恰当的简单的跟UI Thread交互的方式. 2. 它不需要通过操控Threads或Handler就可以将后台操作以及其结果展示在UI Thr ...

最新文章

  1. 安装oracle后在cmd,在WINDOWS上安装ORACLE RAC的注意事项
  2. 动态加载laydate 失效_Java对象的内存布局+反射的原理+动态代理+ 并发和锁+文末彩蛋...
  3. java 输出字符串的所有排列_JAVA 输出指定字符串所有排列组合
  4. 呼叫前转业务在VoIP系统中的实现
  5. Ceph (2) - 安装Ceph集群方法 2:使用cephadm配置Nautilus版Ceph集群
  6. 鸿蒙OS比fuchsia的优势,第一天带你走进华为开发者大会,了解鸿蒙OS
  7. XCode插件因为升级不能用了怎么办?几个步骤教你搞定
  8. 基于STM32单片机的智能药盒定时提示吃药喂水蓝牙APP方案原理图设计
  9. 怎样挑选鱼头 鱼头怎么做好吃
  10. nihao, woshi mr jhon
  11. JAVA图片裁剪上传实例______软件开发-帮助类
  12. JavaSE总结知识点 重要的点(并不是详细的教材语录)
  13. 【实习日记】实习第N天 从零开始搭建一个tiktok puppet(一)
  14. OpenCV图像阈值
  15. Error:All flavors must now belong to a named flavor dimension. Learn more at
  16. 第七章——数据库设计
  17. puppy linux php,硬盘/U盘安装Puppy Linux方法
  18. 金融机构电子签应用汇总:覆盖7类组织的30多种签署需求
  19. ubuntu/lubuntu/kubuntu/xubuntu各版本镜像下载地址
  20. 今年专科计算机分数线,全国31省市2017年高考录取分数线最新汇总

热门文章

  1. Gradle 实现 Android 多渠道定制化打包
  2. Js勾选同意协议教程-更新篇
  3. 前端——列表、表格、表单
  4. day1 -- ELMO语言模型
  5. 计算机系统是日语,如何在计算机系统中添加日语输入法
  6. python清华大学出版社答案_清华大学出版社的这本Python入门书,出版8年 仍经久不衰...
  7. python pandas处理excel 统计数据_python使用pandas处理excel数据
  8. UnityAR-平面检测
  9. C++_基础1.1初识——Hellow world
  10. imgareaselect+php实现图片裁剪保存