time-to-botec

Benchmark sampling in different programming languages
Log | Files | Refs | README

_baseSet.js (1385B)


      1 var assignValue = require('./_assignValue'),
      2     castPath = require('./_castPath'),
      3     isIndex = require('./_isIndex'),
      4     isObject = require('./isObject'),
      5     toKey = require('./_toKey');
      6 
      7 /**
      8  * The base implementation of `_.set`.
      9  *
     10  * @private
     11  * @param {Object} object The object to modify.
     12  * @param {Array|string} path The path of the property to set.
     13  * @param {*} value The value to set.
     14  * @param {Function} [customizer] The function to customize path creation.
     15  * @returns {Object} Returns `object`.
     16  */
     17 function baseSet(object, path, value, customizer) {
     18   if (!isObject(object)) {
     19     return object;
     20   }
     21   path = castPath(path, object);
     22 
     23   var index = -1,
     24       length = path.length,
     25       lastIndex = length - 1,
     26       nested = object;
     27 
     28   while (nested != null && ++index < length) {
     29     var key = toKey(path[index]),
     30         newValue = value;
     31 
     32     if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
     33       return object;
     34     }
     35 
     36     if (index != lastIndex) {
     37       var objValue = nested[key];
     38       newValue = customizer ? customizer(objValue, key, nested) : undefined;
     39       if (newValue === undefined) {
     40         newValue = isObject(objValue)
     41           ? objValue
     42           : (isIndex(path[index + 1]) ? [] : {});
     43       }
     44     }
     45     assignValue(nested, key, newValue);
     46     nested = nested[key];
     47   }
     48   return object;
     49 }
     50 
     51 module.exports = baseSet;