2013-06-11 3 views
0

Я хотел бы уменьшить размер массива javascript, удалив пустые узлы через регулярные интервалы (скорее всего, каждый четный или нечетный узел). Есть ли простой и эффективный способ сделать это, используя встроенные методы javascript или d3.js?Javascript: Удаление пустых элементов из большого массива по шаблону индекса

фон

Для управляемых данных, в браузере приложения, у меня есть массив с индексацией, представляющими единицами на горизонтальную шкалу времени.

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

Сопоставление временного масштаба с реальными данными достаточно просто, используя выбор d3 (пустые элементы игнорируются), но учитывая размер этих массивов и тот факт, что они пройдены немного, раннее удаление кажется имеющим смысл. Там, где имеются данные , это очень большое (дерево), поэтому удаление, возможно, лучше всего сделано на месте, а не путем создания нового массива.

Из документации массива (native и d3.js) Я вижу несколько возможных подходов, но я немного опасаюсь как проблем совместимости, так и возможных побочных эффектов. Возможно, удивительно, что я также не нашел примеров, связанных с массивом , с индексом.

Подводя итог:

  1. узлы должны быть удалены по следующей схеме (каждый 2-й узел и т.д.)
  2. эти узлы гарантированно пусты.
  3. никаких дополнительных зависимостей (jQuery и т. Д.) Спасибо.

Большое спасибо

ответ

0

Вы можете сделать это «вручную» или использовать функцию фильтра.

Функция фильтрации быстрее ... написать:

function isEmptyNode(x, i) { return (i & 1) } ; // to keep odd nodes 

var myNewArray = myOldArray.filter(isEmptyNode) ; 

... но хороший старый цикл (на месте) это путь путь путь быстрее:

var dst=0; 
for (var i=0, len=myArray.length; i<len ; i++) { if (i & 1) myArray[dst++]=myArray[i] } 
myArray.length = dst; 

Вы может легко изменить if (i & 1) на if (myTestFunction(i)), чтобы иметь более общую фильтрацию.

Для спектаклей, то вы можете проверить здесь, что это более чем в 100 раз быстрее для цикла: http://jsperf.com/filter-odd-items-in-array/2

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