1. ホーム
  2. ジャバスクリプト

[解決済み】Node.jsでオブジェクトのクローンを作成する

2022-04-20 09:52:17

質問

node.jsでオブジェクトをクローンする最も良い方法は何ですか?

例)こんな事態は避けたい。

var obj1 = {x: 5, y:5};
var obj2 = obj1;
obj2.x = 6;
console.log(obj1.x); // logs 6

オブジェクトには属性として複雑な型が含まれている可能性があり、単純な for(var x in obj1) では解決しません。 再帰的なクローンを自分で書く必要があるのでしょうか、それとも私が見ていない何かが組み込まれているのでしょうか?

解決するには?

可能性1

敷居の低いディープコピー。

var obj2 = JSON.parse(JSON.stringify(obj1));

可能性2(非推奨)

注意 この解決策は、現在、非推奨とマークされている のドキュメントを参照してください。 :

<ブロッククオート

util._extend()メソッドは、Node.jsの内部モジュール以外で使用されることを意図したものではありません。しかし、コミュニティがそれを発見し、使用しました。

これは非推奨であり、新しいコードで使用するべきではありません。JavaScript には Object.assign() によって非常によく似た機能が組み込まれています。

オリジナルの回答です。 :

浅いコピーには、Nodeの組み込みの util._extend() 関数を使用します。

var extend = require('util')._extend;

var obj1 = {x: 5, y:5};
var obj2 = extend({}, obj1);
obj2.x = 6;
console.log(obj1.x); // still logs 5

Nodeのソースコード _extend 関数はこの中にあります。 https://github.com/joyent/node/blob/master/lib/util.js

exports._extend = function(origin, add) {
  // Don't do anything if add isn't an object
  if (!add || typeof add !== 'object') return origin;

  var keys = Object.keys(add);
  var i = keys.length;
  while (i--) {
    origin[keys[i]] = add[keys[i]];
  }
  return origin;
};