2016-08-16 27 views
10

Załóżmy, że mamy tablicę obiektów.Alternatywa obiektu Object.assign (... array)

Wywołanie Object.assign(...array) sprawia dział między tymi obiektami, gdzie obiekt z indeksu i nadpisanie istniejących właściwości w obiekcie z indeksem i-1

na przykład:

var array=[{interf:'IPerson',name:'Someone'},{clss:'Person',name:'Ahmed'},{student:true}]; 
 
console.log(
 
    Object.assign(...array) // Object.assign(array[0],array[1],array[2]) 
 
)

Teraz, używając Babel z proponowana składnia rozprzestrzeniania obiektu, możemy zrobić statycznie:

{...array[0],...array[1],...array[2]} // spread used for each object not for array 

Jak to zrobić dynamicznie?

Istnieje nakładanie się kontekstu "składni rozłożonej". Mam na myśli sposób użycia składni rozprzestrzenianej dla obu:

  • Dla tablicy do rozprzestrzeniania elementów.
  • dla wyjścia dosłownym obiektu {} aby dziedziczenie

?

Próbowałem {...array} i zwraca {0:<array[0]>,1:<array[1]>,2:<array[2]>} który jest nie taka sama moc jak Object.assign(...array).

+3

ES7 jest wykonywany i zwalniany, rozprzestrzenianie obiektów nie jest jego częścią. Po prostu powiedz "Proponowana składnia rozprzestrzeniania obiektów", nie mów ES7. – loganfsmyth

+0

Przypisanie nie ma nic wspólnego z dziedziczeniem. Użyj terminów "extend" lub "mixin". – Bergi

+0

@loganfsmyth: Czy uważasz, że powinniśmy mieć tag dla każdej z tych propozycji? (stworzone na żądanie) –

Odpowiedz

20

Szukasz

var obj = Object.assign({}, ...array) 

że tworzy nowy obiekt zamiast mutacji array[0].

+0

Czy mógłbyś mieć bezpieczną alternatywę IE11 dla '.assign()' leżącego wokół? Szukasz tego teraz ze względu na [to] (https://docs.microsoft.com/en-us/scripting/javascript/reference/object-assign-function-object-javascript) (Zobacz wymagania) – Nukeface

+1

Nie, możesz bezpiecznie użyj 'Object.assign' w IE11, tylko [polyfill it] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#Polyfill) – Bergi

+0

Właśnie się okazało być tak również, dzięki – yussan