建立一个返回给定对象的 path
的值的函数。javascript
官网给的demo。java
var objects = [ { 'a': { 'b': 2 } }, { 'a': { 'b': 1 } } ]; _.map(objects, _.property('a.b')); // => [2,1]
由此能够推断,_.property('a.b')
返回的是一个取出对象的a>b
属性的方法。数组
function property(path) { return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path); }
isKey
用来判断是一个property name
仍是property path
函数
property path
,lodash中定义了一个属性路径的概念,用来快速访问对象属性。{a: {b: ['data']}}
,但愿访问到data这个值,能够经过 'a.b[0]'来访问。
import isArray from './isArray.js'; import isSymbol from './isSymbol.js'; /** Used to match property names within property paths. */ var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, reIsPlainProp = /^\w*$/; function isKey(value, object) { if (isArray(value)) { return false; } var type = typeof value; if (type == 'number' || type == 'symbol' || type == 'boolean' || value == null || isSymbol(value)) { return true; } return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || (object != null && value in Object(object)); }
逻辑很简单。code
function toKey(value) { if (typeof value == 'string' || isSymbol(value)) { return value; } var result = (value + ''); return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; }
要注意的是Symbol
类型提早返回。其它类型会转换成字符串。对象
result == '0' && (1 / value) == -INFINITY
ip
这里用来区分0
或者-0
字符串
function baseProperty(key) { return function(object) { return object == null ? undefined : object[key]; }; }
该方法就更简单了,对于没有path property
参数的,就执行该方法。 只是区传入的object
的制定属性的值。源码
function basePropertyDeep(path) { return function(object) { return baseGet(object, path); }; }
能够去翻baseGet的源码了。string
function baseGet(object, path) { path = castPath(path, object); var index = 0, length = path.length; while (object != null && index < length) { object = object[toKey(path[index++])]; } return (index && index == length) ? object : undefined; }
简单过一遍这个方法。就能肯定path返回的是property path
的路径数组。
while (object != null && index < length) { object = object[toKey(path[index++])]; }
经过上边的while
循环一层层拿到目标值。