2016-06-19 2 views
2

Я пытаюсь реализовать w2uimulti select в одной из диаграмм d3, над которыми я работаю.Ошибка Array.prototype

Это ссылка на образец jsfiddle с проблемой.

У меня есть три функции:

//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; 
} 

Мне нужно реализовать эти три в одном из своих функций.

Проблема в том, что всякий раз, когда я пытаюсь реализовать эти функции с помощью Array.prototype, я получаю элементы в мультиселекте как "undefined". Число "undefined" прямо пропорционально числу функтонов с функциями Array.prototype.

Если удалить эти функции, я могу получить множественный выбор, чтобы работать должным образом (только множественный выбор часть, а не на графике в целом. Я не понимаю, что вызывает ошибку.

Любая помощь приветствуется.

+6

И вы только что узнали, почему это плохая идея для изменения собственных прототипов. Теперь сделайте эти обычные функции. – adeneo

+1

И вы только что узнали, почему это плохая идея, чтобы сделать что-либо, не имея всего плана для вашей среды исполнения. Вы можете изменять собственные прототипы без проблем, если вам требуются стандарты кодирования, которые не противоречат этому решению. –

+0

Итак, если я реализую функции как отдельную функцию, она будет работать? – driftking9987

ответ

4

В общем, беспорядок с основными объектами javascript - это плохая идея, когда вы работаете с сторонними библиотеками. Если вы все равно хотите сохранить его таким образом и решить эту конкретную проблему, используйте Object .defineProperty, выключение перечислимого бита

Так, например, изменить

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

в

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; 
    } 
}); 

и аналогичные для другого метода прототипа, который вы добавили.

+0

Спасибо @Hector, он решает проблему, но я реализовал другую функцию, чтобы выполнить все, а не использовать 'Array.prototype'. Поскольку это рабочее решение, я приму ответ. Может помочь кому-то. – driftking9987

Смежные вопросы