首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeError:无法读取未定义范围问题的属性“推送”

TypeError:无法读取未定义范围问题的属性“推送”
EN

Stack Overflow用户
提问于 2020-07-02 02:55:41
回答 2查看 58关注 0票数 0

我有一个json blob,我正试图解析,但我遇到了麻烦。下面是json的例子:

代码语言:javascript
复制
let subscriptions = {
   "Channel-416025343279890452":{
      "PC":{
         "Game-1":[
            1
         ],
         "Game-2":[
            1
         ]
      },
      "XBOX":{
         "Game-2":[
            1
         ],
         "Game-3":[
            1,
            3
         ],
         "Game-4":[
            4,
            5,
         ]
      }
   }
}

我的目标是最终得到一个集合来识别每个游戏的每个平台,比如.

代码语言:javascript
复制
[
   "Game-1":[
      "PC",
      "XBOX",
   ]
]

我的项目使用lodash,所以我希望能用这个库得到一个更易读的解决方案.

代码语言:javascript
复制
let subs = this.subscriptions[this.channel.id];
var gamesAndCategories = [];
_.forOwn(subs, (gamesAndInterests, category) => {
    _.forOwn(gamesAndInterests, (interestId, game) => {
        gamesAndCategories[game].push(category);
    });
});
console.log(gamesAndCategories);

我遇到TypeError: Cannot read property 'push' of undefined了。我尝试将箭头函数替换为function () {},但没有运气。我还想知道是否有一种更简单的方法来提取这些数据?我对json的结构并没有太大的控制,而且我是新来的房客。

如何解决这个变量范围问题,在那里我可以像我所期望的那样构建数组?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-02 03:36:56

您可以使用减少操作收集所有游戏到平台的数据(不需要Lodash )。

  1. 迭代游戏对象(
  2. )中的所有键/值(平台/游戏)对,
  3. 迭代游戏对象中的所有游戏键,以作为值

的平台数组收集游戏所键对象(或Map)中的数据。

代码语言:javascript
复制
const sub = {"PC":{"Game-1":[1],"Game-2":[1]},"XBOX":{"Game-2":[1],"Game-3":[1,3],"Game-4":[4,5]}}

const gamesAndCategories = Object.entries(sub)
  .reduce((map, [ platform, gameObj ]) => {
    Object.keys(gameObj).forEach(game => {
      const games = map[game] || (map[game] = [])
      games.push(platform)
    })
    return map
  }, Object.create(null))
  
console.log(gamesAndCategories)

票数 1
EN

Stack Overflow用户

发布于 2020-07-02 03:30:01

这不是范围问题。您应该指定gamesAndCategories[game]的初始值。

代码语言:javascript
复制
let subscriptions = {
   "Channel-416025343279890452":{
      "PC":{
         "Game-1":[
            1
         ],
         "Game-2":[
            1
         ]
      },
      "XBOX":{
         "Game-2":[
            1
         ],
         "Game-3":[
            1,
            3
         ],
         "Game-4":[
            4,
            5
         ]
      }
   }
}

let subs = subscriptions["Channel-416025343279890452"];
var gamesAndCategories = {};
_.forOwn(subs, (gamesAndInterests, category) => {
    _.forOwn(gamesAndInterests, (interestId, game) => {
        if (gamesAndCategories[game] == undefined) {
            gamesAndCategories[game] = []
        }
        gamesAndCategories[game].push(category);
    });
});
console.log(gamesAndCategories);
代码语言:javascript
复制
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62688250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档