我有一个像这样的对象:
var theObject = {
keyName1: { keyName2: value2, keyName3: value3, keyName4: value40 },
...,
keyName10: { keyName2: value6, keyName3: value7, keyName4: value8 }
}
我知道我可以theObject["keyName10"]["keyName3"]
或theObject.keyName10.keyName3
引用value7
但我需要的是将变量设置为搜索路径,并以某种方式将其传递给theObject
并直接获取value7。
类似的东西:
var path = keyName10.keyName3;
var myValue = theObject(path);
对象可以进一步进入对象开始。 现在我正在通过看起来很糟糕的for循环解决它。 我错过了更好的方式吗?
答案 0 :(得分:1)
我只是尝试添加一个有趣的解决方案。我绝对不会像这样使用它,但这个想法可能对你的情况有用。我也质疑这种方法的效率。
var theObject = {
keyName1: { keyName2: value2, keyName3: value3, keyName4: value40 },
...,
keyName10: { keyName2: value6, keyName3: value7, keyName4: value8 }
}
var path = 'keyName10/keyName3';
function getProp(theObject, path){
var parts = path.split("/"),
idx = parts[0],
newParts = parts.splice(0, 1),
newPath = newParts.join("/"),
obj = theObject[idx];
// add some validation and error handling in case or error on path
// or missing property on obj
// I do not like the line below, would need to find a better way to see
// if the function return something or it does some recursion
// need to figure the right condition to see if we are at des
if(parts.length == 1) {
return obj;
} else {
return getProp(obj, newPath);
}
}
可能会有所帮助:How do I check if an object has a property in JavaScript?
答案 1 :(得分:0)
为什么不创建一个getter函数......
var path = 'keyName10/keyName3'
function getTheThing(key){
var parts = key.split("/")
return theObject[parts[0]][parts[1]]
}
var myValue = getTheThing(path)
您可以通过将对象和密钥传递给getter来使其更通用,允许使用该路径访问不同的对象......
var path = 'keyName10/keyName3'
function getTheThing(key, obj){
var parts = key.split("/")
return obj[parts[0]][parts[1]]
}
var myValue = getTheThing(path,theObject)