はいくつかの本当に奇妙な結果をもたらし、そのうちのいくつかは絶望的に時代遅れであり、いくつかはあまりにも複雑で、それは同じように簡単にではありません。これは、ES6でオブジェクトをクローンするのに適していますか? 「JavaScriptのクローンオブジェクト」のためにグーグルで
let clone = {...original};
はこれで間違っているものはあります?
はいくつかの本当に奇妙な結果をもたらし、そのうちのいくつかは絶望的に時代遅れであり、いくつかはあまりにも複雑で、それは同じように簡単にではありません。これは、ES6でオブジェクトをクローンするのに適していますか? 「JavaScriptのクローンオブジェクト」のためにグーグルで
let clone = {...original};
はこれで間違っているものはあります?
完全に許容可能な、でもmoreso今そのobject spread is stage 3からクローンを作成することができます。人は物事を複雑にする。 immutably新しいオブジェクトとして、元とストアに別の小道具を追加する
const newobj = {...original, prop: newOne}
のクローンを作成する
const clone = {...original}
。
Object.assignを使用します。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
var obj = { a: 1 };
var copy = Object.assign({}, obj);
console.log(copy); // { a: 1 }
しかし、これは深いクローンをすることはありません。深くクローンニングする方法はまだありません。
EDIT:@マイク「Pomax時」Kamermansはコメントで述べたように、あなたは深いあなただけ使うべきJSON.parse(JSON.stringify(input))
あなたのオブジェクトが真のオブジェクトリテラルであり、純粋なデータであれば、JSON.parse(JSON.stringify(input))は適切なディープクローンです。しかし、プロトタイプ、関数、または循環参照が有効になっている瞬間、その解決法はもはや機能しません。 –
@ Mike'Pomax'Kamermansそれは本当です。しかし、getterやsetterの機能を失うことはひどいです... –
オブジェクトを深くクローンする汎用関数が必要な場合は、http://stackoverflow.com/a/13333781/560114を参照してください。 –
を使用して単純なオブジェクト(すなわちなしプロトタイプ、機能や循環参照)を複製することができます...(スプレッド)を反復可能にすると、反復可能でないか、オブジェクトリテラル内でスプレッドを使用するとエラーが発生します。前の答えが解決策です。また、複数のオブジェクト
let obj1 = { firstDay: 'monday' }
let obj2 = { secondDay: 'tuesday' }
let obj3 = { thirdDay: 'thirdDay' }
let clone = Object.assign({},obj1,obj2,obj3)
console.log(clone)
// { firstDay: 'monday',
// secondDay: 'tuesday',
// thirdDay: 'thirdDay' }
あなたはjson.parse(json.stringify(オブジェクト))を使用したくない場合は、再帰的にキーと値のコピーを作成することができます。
function copy(item){
let result = null;
if(!item) return result;
if(Array.isArray(item)){
result = [];
item.forEach(element=>{
result.push(copy(element));
});
}
else if(item instanceof Object && !(item instanceof Function)){
result = {};
for(let key in item){
if(key){
result[key] = copy(item[key]);
}
}
}
return result || item;
}
しかし、最善の方法は、できるクラスを作成することです自己のクローンを返す
class MyClass{
data = null;
constructor(values){ this.data = values }
toString(){ console.log("MyClass: "+this.data.toString(;) }
remove(id){ this.data = data.filter(d=>d.id!==id) }
clone(){ return new MyClass(this.data) }
}
あなたの例は、有効なjavascriptではありません。 –
これは法的なES6ではありません。しかし、そうでなければ、これはクローンではありません。クローンと元のプロパティの両方が同じものを指しています。例えば、 'original = {a:[1,2,3]}'は文字通り 'original.a'である' clone.a 'を持つクローンを与えます。 –
@AlbertoRiveraこれは、[ステージ2](https:// github)という点で、ちょっとした正当なJavaScriptです。これは、「クローン」または「オリジナル」のどちらかを変更すると同じことが*変更されます。 com/sebmarkbage/ecmascript-rest-spread)の提案を発表しました。 – Frxstrem