Skip to content

Instantly share code, notes, and snippets.

@giscafer
Last active March 22, 2018 09:08
Show Gist options
  • Save giscafer/6ccc9014f5cb0c25d7f03db527a3974a to your computer and use it in GitHub Desktop.
Save giscafer/6ccc9014f5cb0c25d7f03db527a3974a to your computer and use it in GitHub Desktop.
原生js,扩展setProperty & getProperty方法,类似lodash的_.set和_.get
/**
* 获取对象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];
}
}
/**
* 给对象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