Last active
March 22, 2018 09:08
-
-
Save giscafer/6ccc9014f5cb0c25d7f03db527a3974a to your computer and use it in GitHub Desktop.
原生js,扩展setProperty & getProperty方法,类似lodash的_.set和_.get
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 获取对象obj的属性key的值,属性key支持多层,如 a.b.c | |
* | |
* @sample | |
* var obj = { a: { b: { c: 1 } } } | |
* var result = getProperty(c,'a.b.c'); | |
* // 结果为 1 | |
* | |
* @param obj 目标对象 | |
* @param key 属性key字符串,支持多层级 | |
*/ | |
var getProperty = function (obj, key) { | |
if (!obj) { | |
return; | |
} | |
if (typeof key !== 'string' || key === '') { | |
return ""; | |
} else if (key.indexOf(".") !== -1) { | |
var keys = key.split('.'); | |
var firstObj = obj[keys[0]] || {}; | |
for (var i = 1; i < keys.length; i++) { | |
if (firstObj) { | |
firstObj = firstObj[keys[i]]; | |
} | |
} | |
return firstObj; | |
} else { | |
return obj[key]; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 给对象obj的属性key进行value赋值,属性key支持多层,如a.b.c | |
* | |
* @sample | |
* var obj={} | |
* setProperty(c,'a.b.c',1); | |
* // 结果为 obj = { a: { b: { c: 1 } } } | |
* | |
* @param obj 需赋值对象 | |
* @param key 属性key字符串,支持多层级 | |
* @param value 要赋的值 value | |
*/ | |
var setProperty = function (obj, key, value) { | |
if (!obj) { | |
return; | |
} | |
// 递归赋值 | |
var inFn = function (_obj, keys, v) { | |
// 最后一个属性key | |
if (keys.length === 1) { | |
_obj[keys[0]] = v; | |
return; | |
} | |
// 0~length-1个key | |
while (keys.length > 1) { | |
var k = keys[0]; | |
if (!_obj[k] || (typeof _obj[k] !== 'object')) { | |
_obj[k] = {}; | |
} | |
var key = keys.shift(); | |
// 自调用判断是否存在属性,不存在则自动创建对象 | |
inFn(_obj[k], keys, v); | |
} | |
} | |
if (typeof key !== 'string' || key === '') { | |
return; | |
} else if (key.indexOf(".") !== -1) { // 支持多层级赋值操作 | |
var keys = key.split('.'); | |
inFn(obj, keys, value); | |
return; | |
} else { | |
obj[key] = value; | |
return; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment