3

ECMAScript5 でオブジェクトのディープ コピーを行うサンプル コードを見つけたいと思います。

コピーはクローンできるはずです

  • ネストされたオブジェクト

  • ネストされた配列

  • 配列内のネストされたオブジェクト (各配列項目を個別に複製)

注: jQuery.extend() はケース 3 を処理しないようです)。また、クリーンな ECMAScript でこれを行いたいと考えています。簡単なグーグル検索では、価値のある実装は見つかりませんでした。

4

3 に答える 3

1

jQuery.extend()他の良い実装が見つからなかったので、私はついに落ち着きました

http://api.jquery.com/jQuery.extend/

于 2012-02-25T12:01:31.107 に答える
1

ワンライナーが必要な場合 (参照されたオブジェクトを反復処理してプリミティブを取得することでオブジェクト参照を削除し、1 つの大きな文字列を連結してから、その文字列を独自のプリミティブ リーフ ノードを持つ新しいオブジェクトに解析します)

JSON.parse(JSON.stringify(obj))

または、多くのコピーを実行する必要がある場合

function deepCopy(o) {
    var copy = o,k;

    if (o && typeof o === 'object') {
        copy = Object.prototype.toString.call(o) === '[object Array]' ? [] : {};
        for (k in o) {
            copy[k] = deepCopy(o[k]);
        }
    }

    return copy;
}

性能比較

于 2015-02-26T20:37:27.003 に答える
0

オブジェクトをコピーするには、toSource メソッドのエミュレーションを使用します。

    <script type="text/javascript">
    Object.prototype.getSource = function() {
      var output = [], temp;
      for (var i in this) {
          if (this.hasOwnProperty(i)) {
              temp = i + ":";
              switch (typeof this[i]) {
                  case "object" :
                      temp += this[i].getSource();
                      break;
                  case "string" :
                      temp += "\"" + this[i] + "\"";    // add in some code to escape quotes
                      break;
                  default :
                      temp += this[i];
              }
              output.push(temp);
          }
      }
      return "{" + output.join() + "}";
      }
      var baz = {"alpha":{"beta":{"charlie": ["delta","epsilon",{"omega":"zeta"}]}}};
      !!Object.prototype.toSource ? alert((baz).toSource() ) : alert((baz).getSource() );
    </script>
于 2012-02-29T06:30:02.373 に答える