字符串object变量解析问题

a可能是这样
var a = {
    result: {
        item: [1,2]
    }
}
也可能是这样
var a = {
    result: []
}
也可能是这样
var a = {
    other: []
}

我要封装根据字符串来找到a对应key的value值

// 这个str传有可能是'result', 'result.items', 'other'
function test (str) {
    // a[str] ???
}
// 那么我这里这么写才能使得上面的object a['变量']解析出来呢?
阅读 5.3k
8 个回答

如果传入的参数约定好,获取内部的值时,属性是按从外往内,用.连接起来的字符串。那么就在test()内部,把参数str拆分开,从外向内依次寻找即可:

function test(obj, str){
    let params = str.split('.'), // 拆分
        len = params.length,
        item = obj;
    
    for(let i=0; i<len; i++){
        item = item[params[i]]
        if( !item ){
            return 'not found';
        }
    }
    return item;
}

执行:

var a = {
    result: {
        item: [1,2]
    }
}
test(a, 'result.item'); // [1, 2]

var a = {
    result: []
}
test(a, 'result.item'); // "not found"
test(a, 'result'); // []

var a = {
    other: []
}
test(a, 'other'); // []
test(a, 'result'); // "not found"

preact源码里有这样的一个函数,可参考
let delve = (obj, key) => (key.split('.').map(p => (obj = obj && obj[p])), obj);

function test (obj, str) {
 return str.split('.').reduce(function(iter, v){return iter && iter[v]}, obj)
}

test(a, 'result.item')
function get( obj, path ) {
    return path.split( '.' ).reduce( ( target, key ) => target[ key ], obj )
}

const obj = { a: { b: 2 } }
console.log( get( obj, 'a.b' ) )    // 2

var a = {

result: {
    item: [1,2]
}

}
var b = {

result: []

}
var c = {

other: []

}
// 这个str传有可能是'result', 'result.items', 'other'
function test (o, str) {

let a = str.split('.')
let r = o;
a.map((item, index)=> {
    r = r[item]
})
return r;

}
let t1 = test(a, 'result.item')
let t2 = test(b, 'result')
let t3 = test(c, 'other')
console.log(t1, t2, t3)

function getVal(str) {
    const attr = str.split('.');
    let final = a;
    for (let val of attr) {
        final = final[val];
    }
    return final;
}
新手上路,请多包涵

var obj={
f1:{f2:{f3:2}}
}
var key="f1.f2.f3"

var value=eval("obj."+key);
没那么复杂噢

var a = {
  other: [1],b:{c:111}
}
function test(a,str){
  str = str.split('.');
  return (a[str[0]]? test(a[str[0]],str.slice(1).join('')):a); //有则返回值,没有则返回整个对象
}
test(a, 'x.x'); // []
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题