簡體   English   中英

如何防止對象/數組突變?

[英]How to prevent object/array mutation?

我一直在嘗試調試奇怪的問題,我終於弄清楚它為什么會發生。 只是不確定如何防止它(;我有這個功能:

getInfo(id) {
  id = id || "zero";
  let i = routeDefinitions.findIndex(r => Boolean(r.name.toLowerCase().match(id)));
  // console.log(i) - works in plunker
  // but in my app sometimes returns -1...
  let current = routeDefinitions[i];
  let next = routeDefinitions[i + 1] ? routeDefinitions[i + 1] : false;
  let prev = routeDefinitions[i - 1] ? routeDefinitions[i - 1] : false;
  return { prev, current, next };
}

..在這個plunker中完美運行 ,但在我的應用程序中,我使用其返回值來更新應用程序狀態(redux模式的自定義實現)。 當我通過此函數發送返回值時:

  private _update(_old, _new) {
    let newState = Object.keys(_new)
      .map(key => {
        if (_old[key] === undefined) {
          _old[key] = _new[key];
        } else if (typeof _new[key] === "object") {
          this._update(_old[key], _new[key]);
        } else {
          _old[key] = _new[key];
        }
        return _old;
      })
      .find(Boolean);

    return Object.assign({}, newState || _old);
  }

.. routeDefinitions數組是變異的,事情開始破壞......我嘗試了幾件事:

let current = [...routeDefinitions][i];
// and:
return Object.assign({}, { prev, current, next });

..但它沒有用。 如何防止routeDefinitions數組的routeDefinitions

編輯 :我設法重現了這個plunker中的錯誤

routeDefinitions數組發生了變異,事情開始破裂

如果您的功能是真的:

getInfo(id) {
  id = id || "zero";
  let i = routeDefinitions.findIndex(r => Boolean(r.name.toLowerCase().match(id)));
  // console.log(i) - works in plunker
  // but in my app sometimes returns -1...
  let current = routeDefinitions[i];
  let next = routeDefinitions[i + 1] ? routeDefinitions[i + 1] : false;
  let prev = routeDefinitions[i - 1] ? routeDefinitions[i - 1] : false;
  return { prev, current, next };
}

然后, routeDefinitions 不會發生變異 其他東西正在改變routeDefinitions。

我通過像這樣修改_update()來解決這個問題:

  private _update2(_old, _new) {
    let newState = {}; 
    Object.keys(_new)
      .map(key => {
        if (_old[key] === undefined) {
          newState[key] = _new[key];
        } else if (typeof _new[key] === "object") {
          newState[key] = this._update2(_old[key], _new[key]);
        } else {
          newState[key] = _new[key];
        }
        return newState;
      })
      .find(Boolean);

    return Object.assign({}, _old, newState);
  } 

我只使用old state來檢查值,不要在_update()完成后再修改它。

Plunker

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM