{"id":538,"date":"2011-03-13T00:18:50","date_gmt":"2011-03-12T23:18:50","guid":{"rendered":"https:\/\/d-mueller.de\/blog\/?p=538"},"modified":"2011-03-13T14:56:49","modified_gmt":"2011-03-13T13:56:49","slug":"javascript-arrays-kopieren","status":"publish","type":"post","link":"https:\/\/d-mueller.de\/blog\/javascript-arrays-kopieren\/","title":{"rendered":"Javascript: Arrays kopieren"},"content":{"rendered":"<p>Banale Aufgabe: Erstelle eine unabh\u00e4ngige Kopie von einem Javascript-Array. Was erstmal billig klingt entpuppt sich f\u00fcr unwissende, PHP verw\u00f6hnte Entwickler doch als tricky.<\/p>\n<pre data-enlighter-language=\"js\" class=\"EnlighterJSRAW\">\r\nvar colors = [&quot;red&quot;, &quot;blue&quot;, &quot;green&quot;];\r\nvar copied = colors;\r\n\r\ncopied[0] = &quot;magenta&quot;;\r\n\r\nconsole.log(colors); \/\/[&quot;magenta&quot;, &quot;blue&quot;, &quot;green&quot;]\r\nconsole.log(copied); \/\/[&quot;magenta&quot;, &quot;blue&quot;, &quot;green&quot;]\r\n<\/pre>\n<p>In diesem Beispiel sehen wir also, dass die vermeintliche Kopie eigentlich das gleiche Element ist. Gleiches gilt entsprechend f\u00fcr das \u00dcbergeben eines <b>Arrays als Parmeter an eine Funktion<\/b>.<\/p>\n<pre data-enlighter-language=\"js\" class=\"EnlighterJSRAW\">\r\nvar colors = [&quot;red&quot;, &quot;blue&quot;, &quot;green&quot;];\r\n\r\ntest(colors);\r\nconsole.log(colors); \/\/[&quot;magenta&quot;, &quot;blue&quot;, &quot;green&quot;]\r\n\r\nfunction test(arr)\r\n{\r\n\tarr[0] = &quot;magenta&quot;;\r\n}\r\n<\/pre>\n<p>Offensichtlich nicht wie von PHP gewohnt <i>By Value<\/i> sondern <i>By Reference<\/i>.<\/p>\n<h2>Ja und wie geht es nun?<\/h2>\n<p>Enter Array.<a href=\"https:\/\/developer.mozilla.org\/en\/JavaScript\/Reference\/Global_Objects\/Array\/slice\">slice<\/a>. Damit lassen sich wirkliche Kopien erstellen.<\/p>\n<pre data-enlighter-language=\"js\" class=\"EnlighterJSRAW\">\r\nvar colors = [&quot;red&quot;, &quot;blue&quot;, &quot;green&quot;];\r\nvar colorscopy = colors.slice(); \/\/or colors.slice(0, colors.length);\r\n\r\ncolorscopy[0] = &quot;magenta&quot;;\r\n\r\nconsole.log(colors); \/\/[&quot;red&quot;, &quot;blue&quot;, &quot;green&quot;]\r\nconsole.log(colorscopy); \/\/[&quot;magenta&quot;, &quot;blue&quot;, &quot;green&quot;]\r\n<\/pre>\n<p>Tada! Als Alternative k\u00f6nnte man sich auch selbst was zusammenbasteln, etwa so:<\/p>\n<pre data-enlighter-language=\"js\" class=\"EnlighterJSRAW\">\r\nfor (var i in original) {\r\n\tcopy[i] = original[i];\r\n}\r\n<\/pre>\n<p>Wer cool ist und \/ oder mit der Bezeichnung <i>slice<\/i> nicht klarkommt, kann es auch elegant per Prototyp l\u00f6sen:<\/p>\n<pre data-enlighter-language=\"js\" class=\"EnlighterJSRAW\">\r\nArray.prototype.copy = function() \r\n{\r\n\treturn this.slice();\r\n}\r\n\r\nvar colors = [&quot;red&quot;, &quot;blue&quot;, &quot;green&quot;];\r\nvar colorscopy = colors.copy();\r\n\/\/...\r\n<\/pre>\n<p>[<b>Erg\u00e4nzung:<\/b> So cool scheint das doch nicht zu sein&#8230; <\/p>\n<blockquote><p>One mis-feature that is often used is to extend Object.prototype or one of the other built in prototypes.<\/p>\n<p>This technique is called monkey patching and breaks encapsulation. While used by widely spread frameworks such as Prototype, there is still no good reason for cluttering built in types with additional non-standard functionality.<\/p><\/blockquote>\n<p>Au\u00dferdem bekommt man so Probleme mit for-in-Loops, bei denen dann auch die Funktion aus dem Prototyp mit auftaucht (danke an Steffen).<\/p>\n<p>(<a href=\"http:\/\/bonsaiden.github.com\/JavaScript-Garden\/#prototype\">Quelle<\/a>)]<\/p>\n<p>H\u00e4tten wir das also abgehakt. Aber es gibt noch einen&#8230;<\/p>\n<h2>Bonus! Arraygr\u00f6\u00dfe erweitern und verk\u00fcrzen<\/h2>\n<p>Javascript Arrays verl\u00e4ngern sich ganz bequem, indem sie den Zwischenraum mit <i>undefined<\/i> ausf\u00fcllen:<\/p>\n<pre data-enlighter-language=\"js\" class=\"EnlighterJSRAW\">\r\nvar colors = [&quot;red&quot;, &quot;blue&quot;, &quot;green&quot;];\r\ncolors[7] = &quot;yellow&quot;;\r\n\r\nalert(colors.length); \/\/8\r\nconsole.log(colors);\r\n\/\/[&quot;red&quot;, &quot;blue&quot;, &quot;green&quot;, undefined, undefined, undefined, undefined, &quot;yellow&quot;]\r\n<\/pre>\n<p>Was viele nicht wissen: Array.length ist nicht readonly. Damit lassen sich Arrays auch verk\u00fcrzen (allerdings nicht verl\u00e4ngern):<\/p>\n<pre data-enlighter-language=\"js\" class=\"EnlighterJSRAW\">\r\nvar colors = [&quot;red&quot;, &quot;blue&quot;, &quot;green&quot;];\r\ncolors.length = 2;\r\nconsole.log(colors);\r\n\/\/[&quot;red&quot;, &quot;blue&quot;]\r\n<\/pre>\n<p>Falls es mal jemand gebrauchen sollte.<\/p>\n<p>[<b>Erg\u00e4nzung 2:<\/b> <\/p>\n<pre data-enlighter-language=\"js\" class=\"EnlighterJSRAW\">\r\nvar copied = [].concat(original);\r\n<\/pre>\n<p>Ein weiterer geschmeidiger Weg, um ein Array zu kopieren (danke an Fabian).]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Banale Aufgabe: Erstelle eine unabh\u00e4ngige Kopie von einem Javascript-Array. Was erstmal billig klingt entpuppt sich f\u00fcr unwissende, PHP verw\u00f6hnte Entwickler doch als tricky. var colors = [&quot;red&quot;, &quot;blue&quot;, &quot;green&quot;]; var copied = colors; copied[0] = &quot;magenta&quot;; console.log(colors); \/\/[&quot;magenta&quot;, &quot;blue&quot;, &quot;green&quot;] &hellip; <a href=\"https:\/\/d-mueller.de\/blog\/javascript-arrays-kopieren\/\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,3],"tags":[],"class_list":["post-538","post","type-post","status-publish","format-standard","hentry","category-javascript","category-webdev"],"_links":{"self":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/538","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/comments?post=538"}],"version-history":[{"count":0,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/538\/revisions"}],"wp:attachment":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/media?parent=538"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/categories?post=538"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/tags?post=538"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}