2

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

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

我试过以下:

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

console.log(preferenceRank);

我收到此错误:

"TypeError: preference.map is not a function"...

需要输出:

{
  1: "ethnicity",
  2: "occupation",
}
4

7 回答 7

7

您可以使用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)

(顺便说一句,在您的代码中使用它没有任何意义map,因为您没有将数组映射到任何东西,并且您忽略了map. .)forEachfor


2021 更新

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

const preferenceRank = Object.fromEntries(
  Object.entries(preference).map(([key, { rank }]) => [rank, key])
)
于 2020-08-10T15:39:24.793 回答
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);

于 2020-08-10T15:41:02.333 回答
5

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

Object.entries(preference).reduce((out, [key, value]) => {
  out[value.rank] = key;
  return out;
},{});
于 2020-08-10T15:40:07.813 回答
4

您可以映射条目并构建一个新对象。

const
    preference = { ethnicity: { value: "Gurung", rank: 1 }, occupation: { value: "Banker", rank: 2        } },
    result = Object.fromEntries(Object
        .entries(preference)
        .map(([k, { rank }]) => [rank, k])
    );

console.log(result);

于 2020-08-10T15:42:02.213 回答
2

您可以映射键并将排名/键对象添加到结果对象。

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

let res= {};
Object.keys(preference).map((el,key) => {
    res[preference[el].rank] = el;
});

console.log(res);

于 2020-08-10T15:52:25.477 回答
2

这将起作用。

const preferenceRank = {};
Object.keys(preference).forEach((key) => {
  preferenceRank[preference[key]['rank']] = preference[key]['value'];
});

console.log(preferenceRank);
于 2020-08-10T15:39:49.237 回答
0

map 仅适用于数组,您正在处理一个对象,您可以通过使用来遍历对象的键

Object.keys(preference)

这将向您返回数组中的对象键,如下所示 ["ethnicity","occupation"]

然后您可以根据需要进行映射并执行代码

于 2020-08-10T15:38:20.580 回答