2016-06-19 20 views
2

Ich versuche w2uimulti select in einem der d3-Diagramme zu implementieren, die gerade arbeiten.Array.prototype verursacht Fehler

Dies ist der Link zu Beispiel jsfiddle mit dem Problem.

Ich habe drei Funktion:

//get a column of an array 
Array.prototype.getColumn = function(name) { 
    return this.map(function(el) { 
    // gets corresponding 'column' 
    if (el.hasOwnProperty(name)) return el[name]; 
    // removes undefined values 
    }).filter(function(el) { 
    return typeof el != 'undefined'; 
    }); 
}; 
//remove duplicates in an array 
Array.prototype.contains = function(v) { 
    for (var i = 0; i < this.length; i++) { 
    if (this[i] === v) return true; 
    } 
    return false; 
}; 
Array.prototype.unique = function() { 
    var arr = []; 
    for (var i = 0; i < this.length; i++) { 
    if (!arr.contains(this[i])) { 
     arr.push(this[i]); 
    } 
    } 
    return arr; 
} 

ich diese drei in einer meiner Funktionen implementieren müssen.

Problem ist, dass, wenn ich versuche, diese Funktionen mit Array.prototype zu implementieren, ich Elemente in der Multiselect als "undefined". Die Nummer "undefined" ist direkt proportional zur Anzahl der Funktionen mit Array.prototype Funktionen.

Wenn ich diese Funktionen zu entfernen, kann ich den Multi-Select bekommt richtig arbeiten (nur der Multi-Select-Teil, nicht das Diagramm als Ganze. Ich verstehe nicht, was den Fehler verursacht.

Jede Hilfe ist willkommen. Vielen Dank.

+6

Und Sie haben gerade gelernt, warum es eine schlechte Idee ist, native Prototypen zu ändern. Stellen Sie nun diese regulären Funktionen statt. – adeneo

+1

Und Sie haben gerade erfahren, warum es keine gute Idee ist, etwas zu tun, ohne einen vollständigen Plan für Ihre Ausführungsumgebung zu haben. Sie können native Prototypen problemlos ändern, solange Sie Kodierungsstandards benötigen, die nicht mit dieser Entscheidung in Konflikt stehen. –

+0

Also, wenn ich die Funktionen als separate Funktion implementieren, wird es funktionieren? – driftking9987

Antwort

4

Im Allgemeinen mit den Kern JavaScript-Objekte zu stören ist eine schlechte Idee, wenn Sie mit den Bibliotheken von Drittanbietern arbeiten.Wenn Sie immer noch so bleiben und dieses spezielle Problem lösen wollen, verwenden Sie das Objekt .defineProperty-Methode, das aufzählbare Bit

deaktivieren So zum Beispiel ändern

Array.prototype.contains = function(v) { 
    for (var i = 0; i < this.length; i++) { 
    if (this[i] === v) return true; 
    } 
    return false; 
}; 

zu

Object.defineProperty(Array.prototype, 'contains', { 
    enumerable: false, 
    value: function(v) { 
     for (var i = 0; i < this.length; i++) { 
      if (this[i] === v) return true; 
     } 
     return false; 
    } 
}); 

und ähnlich für andere Prototyp-Methode, die Sie hinzugefügt haben.

+0

Dank @Hector, es löst das Problem, aber ich habe eine andere Funktion implementiert, um die Dinge zu erledigen, anstatt 'Array.prototype' zu ​​verwenden. Da es eine funktionierende Lösung ist, werde ich die Antwort akzeptieren. Könnte jemandem helfen. – driftking9987