要求
var obj = {
a:{
b:234
},
b:[
{
b1:123,
b2:456
},
{
b1:123,
b2:456
}
],
c:[
[
{
c1:7890
}
],
[
{
c1:123456
}
]
]
}
get(obj,'a.b')
get(obj,'b[1].b1')
get(obj,'c[0][0].c1')
get(obj,'c[1][0].c1')
Code
数据劫持
function observe(data) {
if (!data || typeof data !== 'object') {
return;
}
Object.keys(data).forEach(key => {
defineReactive(data, key, data[key]);
observe(data[key]);
});
}
function defineReactive(data, key, value) {
Object.defineProperty(data, key, {
enumerable: true,
configurable: true,
get() {
return value;
},
set(newValue) {
if (newValue !== value) {
observe(newValue);
value = newValue;
}
}
});
}
get方法
function get(data,paths){
observe(obj);
let _reg = /\[(\d*?)\]/gim,
isExitsArray = paths.match(_reg);
if(isExitsArray){
let _paths = paths.split('.');
return _paths.reduce((prev,item,index,arr)=>{
if(item.match(_reg)){
let arrIndexs = [];
item.match(_reg).forEach((regItem)=>{
arrIndexs.push(parseInt(regItem.slice(1)));
});
let key = item.slice(0,item.indexOf('['));
return arrIndexs.reduce((prevIdx,idx,_idx,arrIndexs)=>{
return prevIdx[idx];
},prev[key]);
}else{
return prev[item];
}
},data)
}else{
let _paths = paths.split('.');
let res = _paths.reduce((prev,item,index,arr)=>{
return prev[item];
},data);
return res;
}
}