JS 对象多层级快速赋值或取值

182 阅读1分钟

一、对象多层级快速赋值

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'