【问题标题】:loop through nested object javascript循环嵌套对象javascript
【发布时间】:2020-11-30 05:49:51
【问题描述】:

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

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",
}

【问题讨论】:

  • 将对象转为数组,使用map方法。
  • map 是一个数组函数。您可以使用Object.keys() 来迭代键,然后通过preference[key] 获取您的排名值。

标签: javascript nested-object


【解决方案1】:

您可以使用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的返回值。你可能想要@ 987654328@ 代替,或者像我现在使用的那样,使用 for 循环。)


2021 年更新

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

const preferenceRank = Object.fromEntries(
  Object.entries(preference).map(([key, { rank }]) => [rank, key])
)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 可以简化为.reduce(out, [key, { rank }]) => Object.assign(out, { [rank]: key }), {})
    【解决方案3】:

    使用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);

    【讨论】:

      【解决方案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);

      【讨论】:

        【解决方案5】:

        这会起作用。

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

        【讨论】:

          【解决方案6】:

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

          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);

          【讨论】:

            【解决方案7】:

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

            Object.keys(preference)
            

            这将向您返回数组中的对象键,如下所示 [“种族”,“职业”]

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

            【讨论】:

              猜你喜欢
              • 2018-03-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-05-19
              • 2016-04-20
              • 2013-05-06
              相关资源
              最近更新 更多