循环遍历嵌套对象javascript

Azi*_*ima 1 javascript nested-object

我正在尝试遍历以下嵌套对象并获得如下输出:

const preference = {
    "ethnicity": {
        "value": "Gurung",
        "rank": 1
    },
    "occupation": {
        "value": "Banker",
        "rank": 2
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试了以下操作:

let preferenceRank = {};
preference.map(pref => {
  preferenceRank[pref.rank] = pref; 
});

console.log(preferenceRank);
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

"TypeError: preference.map is not a function"...
Run Code Online (Sandbox Code Playgroud)

所需输出:

{
  1: "ethnicity",
  2: "occupation",
}
Run Code Online (Sandbox Code Playgroud)

Che*_*yDT 6

您可以使用Object.entries一次获取键和值(作为数组数组[key, value]):

const preference = {
    "ethnicity": {
        "value": "Gurung",
        "rank": 1
    },
    "occupation": {
        "value": "Banker",
        "rank": 2
    }
}

const preferenceRank = {}
for (const [key, { rank }] of Object.entries(preference)) {
    preferenceRank[rank] = key
}

console.log(preferenceRank)
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,在你的代码中使用它没有任何意义map,因为你没有将数组映射到任何东西,并且你忽略了 的返回值map。你可能想要forEach代替,或者像我现在使用的那样,一个for循环.)


2021 更新

现在有一种更简单的方法可以广泛使用,使用Object.fromEntries,它与 做相反的Object.entries事情,从而允许我们将整个事情表达为mapping 操作:

const preferenceRank = Object.fromEntries(
  Object.entries(preference).map(([key, { rank }]) => [rank, key])
)
Run Code Online (Sandbox Code Playgroud)


Chr*_*isG 5

您可以使用.entries()函数来映射对象。

Object.entries(preference).reduce((out, [key, value]) => {
  out[value.rank] = key;
  return out;
},{});
Run Code Online (Sandbox Code Playgroud)


Bar*_*mar 5

用于Object.entries()获取对象的键和值的数组。然后你可以循环它。

forEach如果循环是为了产生副作用而执行的,而不是使用回调函数返回的值,则使用。

const preference = {
    "ethnicity": {
        "value": "Gurung",
        "rank": 1
    },
    "occupation": {
        "value": "Banker",
        "rank": 2
    }
}

let preferenceRank = {};
Object.entries(preference).forEach(([pref, {rank}]) => {
  preferenceRank[rank] = pref; 
});

console.log(preferenceRank);
Run Code Online (Sandbox Code Playgroud)