@aterentyev

Как сделать нативный код на JavaScript совместимым с библиотеками/фреймворками?

Суть в следующем: в приложении есть много JS кода который работает с массивами, код такого вида:

for(var key in collection){
  newCollection.push(JSON.stringify(collection[key]));
}


Как правило, в массиве находится только то, что нам нужно, например строки. Но когда на страницу добавляется Mootools, он расширяет любой массив кучей дополнительных функций (типа clean, getLast и т.д), и такой цикл начинает проходить не только по элементам массива, но и по этим функциям. В результате приложение падает.

Пока что была добавлена обычная проверка типа данных таким методом:

for(var key in collection){
  if(typeof collection[key] !== 'object') {continue;} // добавлена проверка
  newCollection.push(JSON.stringify(collection[key]));
}


Нормальное ли это решение, или есть что то по элегантнее?
  • Вопрос задан
  • 316 просмотров
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
все эти "ненужные" свойства добавляются через прототип, следовательно нужно проверять:

for(var i in object) {
    if (!object.hasOwnProperty(i)) continue;

    // do stuff
}


в целом же для ваших задач лучше использовать старый добрый .map

var newCollection = collection.map(function (item) {
    return JSON.stringify(item);
});
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
IonDen
@IonDen
JavaScript developer. IonDen.com
Используйте голые объекты для хранения данных.
Чтобы создать такой объект и избавить его от всей унаследованной мишуры из прототипа, делайте так:
var collection = Object.create(null);
// теперь цикл по этой коллекции
for (var key in collection) {
    // будет выдавать вам то что нужно без всяких проверок
}
Ответ написан
Комментировать
@aterentyev Автор вопроса
Как оказалось, обычный цикл for (не for in) также можно использовать, т.к он проходит только по значениям массива, не учитывая то, что лежит в prototype

for(i=0; i < a.length; i++){
console.log(a[i]); 
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы