一、对象多层级快速赋值
1.目标是快速用.拼接或者数组的方式给对象赋值,如果对象属性没有则创建对应属性
首先使用 Array.isArray(path) 方法判断 路径参数类型如果不是数组利用 split 方法转换为数组格式
function setObjectValue(obj, path, value) {
const pathList = Array.isArray(path)?path:path.split('.');
const len = pathList.length - 1;
for (var i = 0; i < len; i++) {
const p = pathList[i];
if (!obj[p]){ //属性不存在则创建
obj[p] = {}
};
obj = obj[p];
}
obj[pathList[len]] = value; //最后利用[] 传入路径变量 赋值
}
//使用实例
const myObj ={};
setObjectValue(myObj, 'a.b.c', 'value'); // myObj = {"a":{"b":{"c":"value"}}}
setObjectValue(myObj, ['m','n',2,'d'], 'value'); // myObj = {"a":{"b":{"c":"value"}},"m":{"n":{"2":{"d":"value"}}}}
2.利用已有的轮子lodashjs 对象set方法 快速实现
var object = { 'a': [{ 'b': { 'c': 3 } }] };
_.set(object, 'a[0].b.c', 4);
console.log(object.a[0].b.c);
// => 4
_.set(object, ['x', '0', 'y', 'z'], 5);
console.log(object.x[0].y.z);
// => 5
二、对象多层级快速取值
1.目标是快速用.拼接或者数组的方式对象取值,如果对象属性没有则返回 undefined
function getObjectValue(obj, path) {
const keys = Array.isArray(path)?path:path.split('.');
for (let i = 0; i < keys.length; i++) {
if (!obj || typeof obj !== 'object' || keys[i] in obj === false) {
return undefined; // 如果路径中的某个属性不存在,返回undefined
}
obj = obj[keys[i]];
}
return obj;
}
// 使用示例
const myObj = {
a: {
b: {
c: '1'
}
}
};
const value = getObjectValue(myObj, 'a.b.c'); // value = '1'
const value = getObjectValue(myObj, 'a.b'); // value ={"c":"1"}
const value = getObjectValue(myObj, ['a','b']); // value ={"c":"1"}
2.利用已有的轮子lodashjs 对象get方法 快速实现
var object = { 'a': [{ 'b': { 'c': 3 } }] };
_.get(object, 'a[0].b.c');
// => 3
_.get(object, ['a', '0', 'b', 'c']);
// => 3
_.get(object, 'a.b.c', 'default');
// => 'default'