Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS获取更改父名称的嵌套键的值_Javascript - Fatal编程技术网

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所述,现在更新循环。现在应该很好了。