12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- /*!
- * 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';
- }
|