使用字符串访问多维对象

Use string to access multidimensional object?

本文关键字:对象 访问 字符串      更新时间:2023-09-26

假设我有一个字符串:'first.second.last'

我还有一个对象:

{
    'first': {
        'second' : {
            'last': "value"
        }
    }
}

我如何使用该字符串访问"value" ?

像这样…

var o = {
    'first': {
        'second' : {
            'last': "value"
        }
    }
};
var s = 'first.second.last';
var val = s.split('.').reduce(function(p, c) {
    return p.hasOwnProperty(c) && p[c] || p;
}, o);

这将钻入您的对象并找到最深处匹配的键。相反,如果您想为任何匹配键的失败返回null,则将reduce回调更改为

function(p, c) {
    return p && p.hasOwnProperty(c) && p[c] || null;
}

如果您需要Array.prototype.reduce的旧版支持,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce#Polyfill

那不是一个数组,而是一个对象。如果你想访问该对象中的last,如果有一个变量的内容名为example:

example['first']['second']['third']

如果你想要一个动态设置,而你不确定深度,试试这样做:

var myString = 'first.second.last'
var myObj = {
    'first': {
        'second' : {
            'last': "value"
        }
    }
}
myString.split('.').forEach(function(item) {
   myObj = myObj[item]    
})

在最终值将有您想要的输出。现在,有人可能会使用一个简单的util或库来完成此操作,或者使用更实用的方法来应用此方法,不幸的是,此时没有更智能的方法。

可以像使用[]表示法访问数组一样访问对象。如果你把这个字符串拆分你可以输入sample["first"]["second"]["third"]

因此,我认为这应该可以工作:

var sample = {
    'first': {
        'second' : {
            'last': "value"
        }
    }
}
var str = "first.second.last";
var current = sample;
str.split('.').forEach(function(prop) {
   current = current[prop];
})
return current;