2016-04-04 27 views
0

Küçük bir sorunum var.JSON Silme özelliği kaynak değişkeninde silme de

var template = data; 
delete template.candidates; 

yukarıda kodu da data.candidates siler. Yine de başka bir mantıkla çözebilirim. Ama bunun arkasındaki asıl sebebi ve bunun için uygun bir çözüme ihtiyacım var (geçici çözüm değil). Varsayılan = olarak önceden

+0

Nesnenin bir kopyasını oluşturmanız gerekir - buraya bir göz atın: http://stackoverflow.com/questions/728360/most-elegant-way-to-clone-a-javascript-object – somethinghere

+0

Bkz. Javascript, referans veya geçiş-değer dili mi?] (Http://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by-value-language) – Liam

cevap

2

yılında

sayesinde sadece Nesne referansı oluşturur.

var template = Object.assign({}, data); 

ES5 - -

var template = JSON.parse(JSON.stringify(data)); 

İkisi seçenek yeni değişkeninde nesneyi klonlamak olacak (sizin için gereklilik olan) klonlamak için,

ES2015 (ES6) Aşağıdaki yapabilirsiniz template denir. Şimdi bir sonraki işlem sadece data'un sağlam kaldığı şablondan verileri silecektir.

+0

TeşekkürlerBikas, bu yardımcı oldu –

1

Bu, numaralı başvuruya template değişkenine başvuruda bulunduğunuz için gerçekleşir.

var data = { 
 
    candidates: [1, 2], 
 
    test: [1] 
 
}; 
 
var template = data.constructor(); 
 
for (var attr in data) { 
 
    if (data.hasOwnProperty(attr)) template[attr] = data[attr]; 
 
} 
 
delete template.candidates; 
 
console.log(data, template);
: Şablonunuzun var içine nesnenin bir kopyasını oluşturmak için gereken

var template = JSON.parse(JSON.stringify(data))

0

: Bu "sorun" çözmek için kolay bir yol böyle bir şey yaparak nesneyi klonlamaktır

1

Bir değişkene bir Nesne atadığınızda, değişken aslında Nesneyi "içermez" (tamsayıda olduğu gibi), değişken yalnızca Obje'ye bir başvuru içerir. ct. var template = data'u atayarak, data'u template'a kopyalamıyorsanız, yalnızca referansı Nesne template başvurusuna göndermektesiniz. Bu nedenle, artık iki Değişkeni var, aynı Nesneye başvuruyorsunuz ve bu nedenle bu değişkenlerden herhangi biriyle bir şey yapıyor, aynı Nesneyi etkileyecektir. Yani bu çözüm, aslında template

0

sen yaşamaya devam edip sorunu için data den Nesne klonlamak kod verilerinde, değişkenlikle bir sorundur ve şablon aslında aynı nesne başvurusu ve bu nedenle değişir biri diğerini etkileyecektir. Değişkenlerinizi değiştirmemek için bir çaba sarfetmeli ve bunun yerine onlarla bir şey değiştirmeniz gerektiğinde yeni bir nesne döndürmelisiniz. Object.assign() veya spread operatörünü kullanmak isteyeceksiniz. Başka bir sorun ise, kullandığınız delete işlevinin JS'den nesne anahtarlarını silmenin doğru bir yolu olmadığından aslında oldukça yavaştır.

const jsonFunction = input => { 
    return { 
     ...input, 
     candidates: null, 
     ...input 
    } 
}; 

const data = jsonFunction(template); 

veya alternatif olarak bunları birbirlerine etkilemeden data ve template başa anlamına gelir Object.assign()

const jsonFunction = input => { 
    return Object.assign({}, input, candidates: null); 
} 

const data = jsonFunction(template); 

Bu yeni bir nesne dönmek ve immutably hallediyorum tarafından, verilere atar ile

.

İlgili konular