56 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*!
 | |
|  * set-value <https://github.com/jonschlinkert/set-value>
 | |
|  *
 | |
|  * Copyright (c) 2014-2015, 2017, Jon Schlinkert.
 | |
|  * Released under the MIT License.
 | |
|  */
 | |
| 
 | |
| 'use strict';
 | |
| 
 | |
| var split = require('split-string');
 | |
| var extend = require('extend-shallow');
 | |
| var isPlainObject = require('is-plain-object');
 | |
| var isObject = require('is-extendable');
 | |
| 
 | |
| module.exports = function(obj, prop, val) {
 | |
|   if (!isObject(obj)) {
 | |
|     return obj;
 | |
|   }
 | |
| 
 | |
|   if (Array.isArray(prop)) {
 | |
|     prop = [].concat.apply([], prop).join('.');
 | |
|   }
 | |
| 
 | |
|   if (typeof prop !== 'string') {
 | |
|     return obj;
 | |
|   }
 | |
| 
 | |
|   var keys = split(prop, {sep: '.', brackets: true}).filter(isValidKey);
 | |
|   var len = keys.length;
 | |
|   var idx = -1;
 | |
|   var current = obj;
 | |
| 
 | |
|   while (++idx < len) {
 | |
|     var key = keys[idx];
 | |
|     if (idx !== len - 1) {
 | |
|       if (!isObject(current[key])) {
 | |
|         current[key] = {};
 | |
|       }
 | |
|       current = current[key];
 | |
|       continue;
 | |
|     }
 | |
| 
 | |
|     if (isPlainObject(current[key]) && isPlainObject(val)) {
 | |
|       current[key] = extend({}, current[key], val);
 | |
|     } else {
 | |
|       current[key] = val;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return obj;
 | |
| };
 | |
| 
 | |
| function isValidKey(key) {
 | |
|   return key !== '__proto__' && key !== 'constructor' && key !== 'prototype';
 | |
| }
 |