2015-12-16 9 views
5

Betrachten folgendes Beispiel hat:angular.copy wenn Array benutzerdefinierte Eigenschaft

var ar = [4, 2, 3]; 
ar.$x = 'something'; 
var br = angular.copy(ar); 
console.dir(br); 

br nicht $x Eigenschaft hat nicht mehr, denn wenn Array kopiert, Winkel iteriert mit for (;;;) welchen benutzerdefinierten Eigenschaften nicht sehen (wenn es iteriert mit for in dann würde es funktionieren).

Welche der folgenden soll ich tun?

  1. Array wie Klasse erstellen und dann Eigenschaft zuweisen;
  2. Wenn es sich um einen Fehler handelt, melden Sie ihn angular;
  3. Ändern Sie meinen Code, da das Zuweisen der Eigenschaft zu Array keine gute Übung ist;
+0

Warum Sie eine Eigenschaft auf das Array zuweisen werden? Dies wird helfen zu entscheiden, ob 3 wahr ist. – sdgluck

+0

@sdgluck Ich gebe '$ modifizierte' Eigenschaft dem Array zu, wenn sich etwas darin geändert hat. – karaxuna

Antwort

5

Versuchen angular.merge() Dies ist eine tiefe Kopie, die zählbare Eigenschaften enthält.

var ar = [4, 2, 3]; 
ar.$x = 'something'; 
var br = angular.merge([], ar); 
console.dir(br); 

Ausgabe

Array[3] 
    0: 4 
    1: 2 
    2: 3 
    $x: "something" 
    length: 3 
    __proto__: Array[0] 
+2

Hasse, um die gute Laune zu verderben, aber 'merge()' macht ** nicht ** eine tiefe Kopie, es erweitert einfach 'br' mit' ar'. Wenn Sie danach 'ar' ändern, sagen wir' ar.y = 'x'', dann wird 'br' auch' y:' x'' enthalten. Machbarkeitsstudie -> ** http: //plnkr.co/edit/idH8tKqRb2zGXT817UvV? P = Vorschau ** – davidkonrad

+1

** Good Catch **. Mein Eifer, das OP-Beispiel zu erfüllen, führte dazu, dass das neue Array, in das ich mich einfügen wollte, weggelassen wurde. Ich habe die Antwort mit dem richtigen Code aktualisiert. 'var br = angular.merge (ar)' sollte 'var br = angular.merge ([], ar)' sein. Aktualisierte POC -> http://plnkr.co/edit/UOGX1CpoOfr0QA4YqNda?p=preview. –

+0

Ich habe meinen Code geändert, aber diese Antwort markiert, weil sie das Problem löst, das in Frage steht. – karaxuna

2

Ich denke, dass es kein Winkelproblem ist. Wenn Sie eine solche Anweisung aufrufen:

ar.$x = 'something'; 
console.log(Object.prototype.toString.call(ar)); 

Sie werden sehen, dass [object Array] protokolliert. Das ist, wie Array.isArray() Methode funktioniert, und wiederum sein, wie eckige copy() Methode entscheidet, wie durch die Entität durchlaufen als das Argument durchlaufen wird. Diese Erkennung ist entscheidend, weil for ... in Schleife auf einem Array einige Verwirrungen in anderen Fällen machen kann. Hier wird beschrieben, warum: Why is using "for...in" with array iteration a bad idea?

Ich würde Ihnen empfehlen, Ihren Code für diesen speziellen Fall zu ändern.

1

Versuchen Sie es mit jQuery:

jQuery.extend ([], ar);

var ar = [4, 2, 3]; 
ar.$x = 'something'; 
var br = jQuery.extend([], ar); 
console.dir(br); 
Verwandte Themen