Javascript JS获取更改父名称的嵌套键的值
我需要在下面的示例中获取角色的值Javascript JS获取更改父名称的嵌套键的值,javascript,Javascript,我需要在下面的示例中获取角色的值 const obj ={ id: 1, "website.com": { roles: ["SuperUser"] } } const r = obj.hasOwnProperty("roles") console.log(r) 它的父对象名称(“website.com”)可以在每次我向db请求时更改。获取此变量的最佳方法是什么 obj也会相对较大,我只是没有
const obj ={
id: 1,
"website.com": {
roles: ["SuperUser"]
}
}
const r = obj.hasOwnProperty("roles")
console.log(r)
它的父对象名称(“website.com”)可以在每次我向db请求时更改。获取此变量的最佳方法是什么
obj也会相对较大,我只是没有将其包含在示例中。您可以迭代对象并排除
id
。例如:
for (var x in obj) {
if (x !== 'id') {
console.log(obj[x].roles)
}
}
编辑(解决您的问题编辑):
如果根对象有多个键,那么将域从键移动到值(例如,domain:'website.com'
并将角色向上移动(展平对象);或者可以使用正则表达式检查看起来像域的键。例如:If(/^[a-zA-Z0-9][a-zA-Z0-9-][1,61}[a-zA-Z0-9](?:\.[a-zA-Z]{2,})+$/.test(x)
而不是if(x!='id')
。regex方法可能很脆弱
编辑2:
您可以像这样使用hasOwnProperty检查:
let roles
for (let x in obj) {
if (obj[x].hasOwnProperty(roles)) {
roles = obj[x])
}
}
let roles = obj["website.com"].roles;
console.log(roles);
您可以通过从
obj['website.com']
的值中解构roles
属性来获取角色
如果您希望动态执行此操作,则需要确定key具有属性为角色的相应对象。找到所有有效候选项后,您可以访问第一个(或任意一个),然后获取其值
const hasRoles=obj=>Object.entries(obj)
.filter(([key,value])=>
value.hasOwnProperty(“角色”);
常量对象={
id:1,
“website.com”:{
角色:[“超级用户”]
}
}
const[first]=hasRoles(obj);
const[website,{roles}]=第一;
console.log(`website=${website}| roles=${roles}`);
仅访问嵌套键,如下所示:
let roles
for (let x in obj) {
if (obj[x].hasOwnProperty(roles)) {
roles = obj[x])
}
}
let roles = obj["website.com"].roles;
console.log(roles);
这样,您将获得一个数组,然后您可以通过索引迭代或获取一个值。由于您不知道名称是什么,因此需要迭代所有属性,并使用roles属性查找第一个属性:
const testObj={
id:1,
“website.com”:{
角色:[“超级用户”]
}
}
常量testObj2={
id:2,
“AnotherWeb.com”:{
角色:[“其他超级用户”]
}
}
功能getRoles(obj){
for(让x在obj中){
if(Object.prototype.hasOwnProperty.call(obj,x))
{
if(obj[x].角色){
返回obj[x].角色;
}
}
}
返回未定义;
}
log(getRoles(testObj));
console.log(getRoles(testObj2));
为什么不obj[“website.com”]。角色
?字符串“website.com”不总是一样的。每次我从API获取数据时,它都会改变,如果obj
中的另一个对象碰巧也有一个角色字段,会发生什么?如果您不知道父键将是什么,并且只知道您正在寻找一个带有“角色”的嵌套对象键,别无选择,只能通过迭代搜索。@chingucoding它不会是存储角色的唯一位置对象实际上相对较大,我只是没有在示例中包含所有字段它不是我的api我无法真正更改它的结构,我再次编辑了它。在obj
中循环每个元素并签入g对于角色
是可行的。这并不理想,因为它意味着迭代对象中的所有内容直到找到它,但由于数据是以这种方式格式化的,我看不到更好的解决方案。Eslint说我不能用于in循环还有其他方法吗?您可以添加Eslint禁用下一行
注释above循环,或者看Polywhill先生的答案,没有for-in循环,字符串“website.com”每次我调用api@hernande好的,我继续更新了这个例子。有没有一种方法可以更简单一些,因为我是一个初学者,我不知道先定义的行和后定义的行是什么。还有,如果你能做的话角色不是一个函数,因为我从文件中声明的变量获取obj值字符串“website.com”每次调用apiEslint时都会更改。我说我不应该用于in循环。还有其他方法吗?按照ESLint所述,现在更新循环。现在应该很好了。