jQuery сортируемый и массивный курорт - PullRequest
1 голос
/ 11 октября 2011

У меня есть массив элементов: markers и таблица, которая обновляет свои строки, чтобы заполнить данными, хранящимися в markers. markers сам содержит объект marker, который помимо прочего имеет широту и долготу.

Когда я заполняю таблицу данными из массива markers, я присваиваю каждой строке идентификатор, основанный на i, когда он проходит через.

На этой таблице у меня есть сортировка по jQuery. Я ищу способ переупорядочивать мой массив markers каждый раз, когда строки сортируются, так что позиция элемента в массиве фактически является значением порядка сортировки. Таким образом, я могу в любое время просто пройтись по массиву и посмотреть, насколько он обновлен.

Пока у меня есть таблица, генерирующая как следует, и заполненный массив markers. Я даже могу вернуть порядок строк после их перетасовки, в тот момент, когда я сохраняю их в массиве orders и просто предупреждаю, это работает (то есть 0,1,2> перетаскивается, чтобы прибегнуть к> 2, 0,1). Я надеялся, что теперь можно будет использовать набор значений в orders, чтобы прибегнуть к исходному массиву markers.

Я думал, что это будет связано с созданием временного массива markersTemp, в котором будут храниться значения, сохраненные в markers, но в новом порядке, за исключением того, что я не знаю, как выполнить цикл для сохранения каждого. Кто-нибудь делал что-нибудь подобное?

Ответы [ 2 ]

1 голос
/ 11 октября 2011
function resort() {
    var order = []; // Get the order of the new rows
    $('#createMapDirections tbody tr').each(function(i, elem){
        order.push(markers[getId($("td", elem))]);
    });
    markers = order;
    updateAll();
}

Старая процедура:

  1. Создать новый список order
  2. Перебрать текущие строки в таблице.Сохранить идентификаторы в текущих строках списка order
  3. Создать новый список markersTemp
  4. Циклический список orderПолучите ID в позиции i в списке order.Пусть markersTemp[i] будет элементом в markers (ссылка на прежнюю позицию через id)
  5. Сброс markers
  6. Установите markers на markersTemp

Оптимизировано:

  1. Создать новый список order
  2. Проходить по каждой строке таблицы.Выдвиньте элемент в соответствии с индексом, возвращаемым из getId() в order
  3. Перезаписать markers на order.
0 голосов
/ 11 октября 2011

Ааа, извиняюсь за потраченное время! Еще 5 минут, и я понял это. Для других с этой проблемой, вот моя вся функция, вызываемая после сортируемого события отброшенного.

Я бы не сказал, что все кончено. Мне было бы очень интересно узнать, является ли это наиболее эффективным / аккуратным способом сделать это. Я знаю, что есть функция массива .sort (), встроенная в javascript, это можно использовать вместо этого?

function resort() {

    var order = new Array(); // Get the order of the new rows
    for (var i = 0; i < markers.length; i++) {
        order.push(getId($('#createMapDirections tbody tr').eq(i).find('td')));
    }

    var markersTemp = new Array();
    for (var i = 0; i < markers.length; i++) {
        var id = order[i];
        markersTemp[i] = markers[id];
    }

    markers.length = 0;
    markers = markersTemp.slice();

    updateAll();

}

Edit:

Хорошо, моя таблица на странице выложена так:

<table><tbody>
    <tr id="row0"><td></td></tr>
    <tr id="row1"><td></td></tr>
    <tr id="row2"><td></td></tr>
</tbody></table>

getId () просто захватывает идентификатор TR и запускает небольшое регулярное выражение, чтобы получить только число. Когда они возвращаются, порядок может быть примерно таким: row2, row0, row1. Я храню этот порядок в orders (временный массив) и заполняю markersTemp (еще один временный массив) значениями markersTemp, но в новом порядке.

function getId(button) {
    return $(button).parents('tr').attr('id').replace(new RegExp('\[A-Za-z]+'), '');
}
...