【问题标题】:Uncaught TypeError: Cannot read property 'get' of null in map function未捕获的类型错误:无法在地图函数中读取 null 的属性“get”
【发布时间】:2018-01-13 20:39:56
【问题描述】:

我有 findPlayerWithID 函数,它返回匹配的玩家 ID

function findPlayerWithID(players, id) {
  let i = 0;
  for (; i < players.count(); i++) {
        if (players.map((degisken) => degisken.get('id'))._tail === undefined) { continue; }

        if (players.map((degisken) => degisken.get('id'))._tail.array[i] === id) {
          return i;
        }
  }
  return -1;
}

但有时这行会出错

 if (players.map((degisken) => degisken.get('id'))._tail === undefined) { continue; }

错误是

gameStore.js:38 Uncaught TypeError: Cannot read property 'get' of null
    at gameStore.js:38
    at immutable.js:3018
    at Ue.__iterate (immutable.js:2208)
    at r.__iterateUncached (immutable.js:3017)
    at F (immutable.js:606)
    at r.T.__iterate (immutable.js:322)
    at r.toArray (immutable.js:4260)
    at new Ue (immutable.js:2067)
    at _t (immutable.js:3572)
    at Ue.map (immutable.js:4403)

我认为错误是因为空对象 如何在这一行中检查 null

if (players.map((degisken) => degisken.get('id')).




immutable.js:1317 Uncaught TypeError: Cannot read property 'merge' of null
    at immutable.js:1317
    at Ne (immutable.js:1973)
    at Ne (immutable.js:1982)
    at Ne (immutable.js:1982)
    at pe.updateIn (immutable.js:1280)
    at pe.mergeIn (immutable.js:1314)
    at gameStore.js:207
    at createReducer.js:15
    at combineReducers.js:133
    at c (createStore.js:178)

更新 与@canaan-seaton answear 我改变 这个

if (players.filter(degisken => degisken !== null).map((degisken) => degisken.get('id'))._tail.array[i] === id) {
          return i;
        }

这项工作 但它在 immutablejs 中给出了另一个错误

Uncaught TypeError: Cannot read property 'merge' of null
    at immutable.js:1317
    at Ne (immutable.js:1973)
    at Ne (immutable.js:1982)
    at Ne (immutable.js:1982)
    at pe.updateIn (immutable.js:1280)
    at pe.mergeIn (immutable.js:1314)
    at gameStore.js:207
    at createReducer.js:15
    at combineReducers.js:133
    at c (createStore.js:178)

在 immutablejs 的这一行

function(m) {return typeof m.merge === 'function' ?

我搜索那个错误 有一些信息,但我不明白我该怎么办https://github.com/facebook/immutable-js/issues/597
这是我的控制台

【问题讨论】:

  • 如果您想将玩家映射到他们的 id,那么您应该使用对象而不是数组,其中键是玩家 id,值是包含玩家数据的对象。您的错误表明您的 player 数组中有 null 值,我无法想象这是有意的。
  • @trixn 谢谢..我现在编辑了问题,它给出了 immutableJS 错误

标签: javascript reactjs react-redux immutable.js


【解决方案1】:

如果您只想检查数组是否有元素,那么您可以执行以下操作......

if (players &amp;&amp; players.length &gt; 0) {/* Do Stuff */}

如果您担心数组中的特定索引为空,那么您可以这样做......

if (players.filter(degisken => degisken !== null)
   .map((degisken) => degisken.get('id'))._tail === undefined)
   {/* Do Stuff */}

【讨论】:

  • thanks.filter 有效。我现在编辑了问题,它给出了 immutableJS 错误
  • with @matmiz answear 它可以工作并且不可变,不会出错,谢谢
【解决方案2】:

通常,检查与undefined 是否相等不是一个好习惯。

我会尝试这样做: 首先,要确保degisken 确实存在,您可以使用degisken &amp;&amp; degisken.get(id)

其次,你可能想使用 Object 的 hasOwnProperty 方法,这在这里会很有用:

players.map((degisken) => {
   const id = degisken && degisken.get('id');
   if(id && id.hasOwnProperty('_tail') && id._tail.array[i] === id){
     return i
   }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2013-05-26
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多