You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					64 lines
				
				1.2 KiB
			
		
		
			
		
	
	
					64 lines
				
				1.2 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*!
							 | 
						||
| 
								 | 
							
								 * Simplified lodash.get to work around the annoying null quirk. See:
							 | 
						||
| 
								 | 
							
								 * https://github.com/lodash/lodash/issues/3659
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = function get(obj, path, def) {
							 | 
						||
| 
								 | 
							
								  let parts;
							 | 
						||
| 
								 | 
							
								  let isPathArray = false;
							 | 
						||
| 
								 | 
							
								  if (typeof path === 'string') {
							 | 
						||
| 
								 | 
							
								    if (path.indexOf('.') === -1) {
							 | 
						||
| 
								 | 
							
								      const _v = getProperty(obj, path);
							 | 
						||
| 
								 | 
							
								      if (_v == null) {
							 | 
						||
| 
								 | 
							
								        return def;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      return _v;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    parts = path.split('.');
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    isPathArray = true;
							 | 
						||
| 
								 | 
							
								    parts = path;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (parts.length === 1) {
							 | 
						||
| 
								 | 
							
								      const _v = getProperty(obj, parts[0]);
							 | 
						||
| 
								 | 
							
								      if (_v == null) {
							 | 
						||
| 
								 | 
							
								        return def;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      return _v;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  let rest = path;
							 | 
						||
| 
								 | 
							
								  let cur = obj;
							 | 
						||
| 
								 | 
							
								  for (const part of parts) {
							 | 
						||
| 
								 | 
							
								    if (cur == null) {
							 | 
						||
| 
								 | 
							
								      return def;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // `lib/cast.js` depends on being able to get dotted paths in updates,
							 | 
						||
| 
								 | 
							
								    // like `{ $set: { 'a.b': 42 } }`
							 | 
						||
| 
								 | 
							
								    if (!isPathArray && cur[rest] != null) {
							 | 
						||
| 
								 | 
							
								      return cur[rest];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cur = getProperty(cur, part);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (!isPathArray) {
							 | 
						||
| 
								 | 
							
								      rest = rest.substr(part.length + 1);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return cur == null ? def : cur;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function getProperty(obj, prop) {
							 | 
						||
| 
								 | 
							
								  if (obj == null) {
							 | 
						||
| 
								 | 
							
								    return obj;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  if (obj instanceof Map) {
							 | 
						||
| 
								 | 
							
								    return obj.get(prop);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return obj[prop];
							 | 
						||
| 
								 | 
							
								}
							 |