2014-11-16 8 views
5

Jak można zaktualizować cały obiekt, powiedzmy:Zastąp wartość obiektu bez zastąpienia odniesienia

var x = {a:1} 
function modify(obj) { 
    obj = {b:2} 
} 
modify(x) 
console.log(x) // {a:1} 

Ale utrzymać odniesienia? Chcę, aby obiekt został zmodyfikowany poza funkcją.

Mój przypadek korzystania lodash.pick wewnątrz mojej funkcji:

if (whitelist) { 
    obj = _.pick(obj, whitelist) 
} 

I nie wydają się znaleźć pick funkcję, która modyfikuje obiekt. Czy istnieje sposób, aby to zrobić, czy też muszę zacząć zwracać kopie obiektu?

Odpowiedz

8

delete wszystko od starego obiektu, a następnie dodać nowe właściwości, keystone przez klucz:

function modify(obj, newObj) { 
 

 
    Object.keys(obj).forEach(function(key) { 
 
    delete obj[key]; 
 
    }); 
 

 
    Object.keys(newObj).forEach(function(key) { 
 
    obj[key] = newObj[key]; 
 
    }); 
 
    
 
} 
 

 
var x = {a:1} 
 
modify(x, {b:42}) 
 
document.write(JSON.stringify(x));

Jeśli zastanawiasz się, czy to dobry pomysł w Gen Odpowiedź brzmi: nie. Zbuduj nowy obiekt, zwróć go z funkcji i przypisz - jest to zdecydowanie preferowany sposób.

+0

Niezły sposób na zrobienie tego. I zgadzam się z twoim punktem końcowym. – Aravind

+0

Skończyło się na tym, że użyłem lodash '_.cloneDeep' i zwróciłem nowy obiekt, ale byłoby to najlepsze rozwiązanie tego pytania. Zgadzam się, to jest okropna praktyka. – Garrett

+0

Czy ktokolwiek może wyjaśnić, dlaczego jest tak okropny? Mój scenariusz jest taki, że mam dużą liczbę obiektów i korzystam z pomocniczego "obiektu referencyjnego", aby uzyskać do nich dostęp za pomocą ich identyfikatorów zamiast pętli w tablicy. Tj. "Modify (referenceObject [objectId], updatedObject);" –

-2

Dlaczego modyfikacja nie powoduje edycji obiektu, do którego odnosi się obj?

Ponieważ wewnątrz modyfikować gdy piszesz:

obj = {b:2} 

Zauważ, że obj jest zmienną lokalną do wywołania funkcji z modyfikować. Utworzono nowy obiekt {b:2}, a lokalna zmienna obj odnosi się teraz do tego nowego obiektu. Przypomnijmy, że zmienna x nadal odnosi się do obiektu {a:1}.

Jeśli x jest zmienną globalną, a jeśli nie ma zmienną lokalną wewnątrz funkcji za pomocą nazwy, wtedy można zrobić:

var x = {a:1}; 
function modify() { 
    x = {b:2} 
} 
modify(); 
console.log(x) // {b:2} 

Dlaczego powyższą pracę kodu?

Podczas wywoływania modify(), próbuje sprawdzić, czy ma zmienną lokalną x, ponieważ nie może znaleźć, wyszukuje w łańcuchu zasięgu. Następnym obszarem, w którym można szukać tego wywołania funkcji, jest zasięg globalny i oczywiście mamy tam zmienną x. Dlatego ta globalna zmienna jest teraz ustawiana.

+0

Idealnie funkcja modyfikuje zmienną przekazaną w. Wygląda na to, że będę musiał zwrócić obiekt zamiast go zmodyfikować. – Garrett

+0

Ale jeśli użyjesz "obj.a = 3" zamiast "obj = {b: 2}" w funkcji Modyfikuj, wartość x zostanie zmieniona. Jak to wyjaśnić? –

+0

@plbsam: Dzieje się tak dlatego, że pisząc obj.a = 3, Javascript najpierw sprawdza właściwość a w obj. Kiedy wywołałeś funkcję modify (x), lokalna zmienna obj funkcji modyfikuj, ustawiona na x, więc obiekt wskazuje na ten sam obiekt, na który wskazuje x. Tak więc pisząc obj.a = 3; , ustawia właściwość tego samego obiektu wskazywanego przez x. Ma sens? – Aravind

1

Można to osiągnąć (nie dokładnie to, co chcesz) jeśli owinąć swój obiekt i zmienić funkcję tak zmodyfikować,

var wrapper = {}; 
wrapper.x = {a:1}; 
function modify(obj, key) { 
    obj[key] = {b:2}; 
} 
modify(wrapper, 'x'); 
console.log(wrapper.x); // {b:2} 
0

Wystąpił ten problem. Po przeprowadzeniu pewnych badań zdecydowałem się przekonwertować objectTwo na ciąg JSON, a następnie zastąpić obiekt ObjectOne analizowaną wersją.Innymi słowy:

var mObjectOne = { ExampleProperty: 10 }; 
var mObjectTwo = { ExampleProperty: 15 }; 

// I wanted mObjectOne to hold the same data as mObjectTwo, but keep a separate reference 
var mObjectTwoAsJSON = JSON.stringify(mObjectTwo); 
mObjectOne = JSON.parse(mObjectTwoAsJSON); 

// Now the references are still different, as desired, but the object data has been updated. 

Dzięki

Powiązane problemy