di-shan-utils
Version:
JavaScript 函数库、工具类
66 lines (58 loc) • 1.61 kB
JavaScript
var staticParseInt = require('./staticParseInt')
var helperGetHGSKeys = require('./helperGetHGSKeys')
var hasOwnProp = require('./hasOwnProp')
var sKeyRE = /(.+)\[(\d+)\]$/
function setDeepProps (obj, key, isSet, value) {
if (obj[key]) {
if (isSet) {
obj[key] = value
}
} else {
var index
var matchs = key ? key.match(sKeyRE) : null
var rest = isSet ? value : {}
if (matchs) {
index = staticParseInt(matchs[2])
if (obj[matchs[1]]) {
obj[matchs[1]][index] = rest
} else {
obj[matchs[1]] = new Array(index + 1)
obj[matchs[1]][index] = rest
}
} else {
obj[key] = rest
}
return rest
}
return obj[key]
}
/**
* 设置对象属性上的值。如果属性不存在则创建它
* @param {Object/Array} obj 对象
* @param {String/Function} property 键、路径
* @param {Object} value 值
*/
function set (obj, property, value) {
if (obj) {
if ((obj[property] || hasOwnProp(obj, property)) && !isPrototypePolluted(property)) {
obj[property] = value
} else {
var rest = obj
var props = helperGetHGSKeys(property)
var len = props.length
for (var index = 0; index < len; index++) {
if (isPrototypePolluted(props[index])) continue
rest = setDeepProps(rest, props[index], index === len - 1, value)
}
}
}
return obj
}
/**
* Blacklist certain keys to prevent Prototype Pollution
* @param {string} key
*/
function isPrototypePolluted(key) {
return key === '__proto__' || key === 'constructor' || key === 'prototype'
}
module.exports = set