Как лучше всего определить, находится ли группа элементов в определенной части массива? - PullRequest
1 голос
/ 31 августа 2011

(см. Пример ниже, чтобы полностью понять, что я спрашиваю)

У меня есть массив элементов, в которые я буду помещать другие элементы и исключать их в зависимости от выбора пользователя.Этот массив всегда имеет «активный набор» смежных элементов, состоящий не более чем из 30 элементов (и он составляет менее 30, если общий набор элементов составляет менее 30, в противном случае он должен быть заполнен).Пользователь может изменить начало активного набора.

Что я хочу знать, так это то, что является «самым чистым» кодом и наиболее эффективным способом проверки того, попадают ли новые элементы, добавленные / удаленные из списка, в список.активный набор, частично или полностью?(Кроме того, если в настоящее время всего 10 предметов, что делает элементы активного набора 0-9, и они добавляют 10 предметов перед предметом 0 - что превращает предмет 0 в предмет 10 - тогда я хочу знать, что нужно изменитьактивный набор для нового элемента от 0 до 19)

ПРИМЕР:

//For this example, I'm making the active set be 10 items so I can write less
var activeSetLength = 10;

//The total set
var allItems = [ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o" ];

//First item in active set (in this example, this makes "m" the last active item)
var activeSet = allItems.slice( 3, 3 + activeSetLength );

/*
 * Now imagine the user is trying to add items into our list, how best do I handle
 * figuring out whether to add them to the activeset list?.
 */
//Adding items into list at position 1 (so only some of these will now be in the active set)
addItems( [ "one", "two", "three", "four" ], 1 );

Пожалуйста, дайте мне знать, если вам нужно больше объяснений, так как это может быть не самый ясный вопрос.Спасибо!

ПРИМЕЧАНИЕ. В "реальном мире" мой activeSet реализован как узел DOM, поэтому элементы в нем изменяются через appendChild / insertBefore / removeChild (это примечание добавлено для пояснения).

1 Ответ

0 голосов
/ 01 сентября 2011

В итоге я сделал снимок до / после обработки сравнения и сделал что-то вроде этого:

addItems: function(items, insertAt)
{
    //The current items in the active set as an array
    var snapshot = this.getSnapshot();

    //Add to items array at position indicated
    this.saveItems( items, insertAt );

    //Change the items in active set
    this.updateActiveSet( snapshot );
}

updateActiveSet: function(oldSnapshot)
{
    //Take a new snapshot
    var currentSnapshot = this.getSnapshot();

    //Last dealt with item's index
    var lastHandled = -1;

    for ( var i = 0, length = oldSnapshot.length; i < length; i++ )
    {
        var old = oldSnapshot[ i ];
        var indexInCurrent = currentSnapshot.indexOf( old );

        //This item is still in the active set
        if ( indexInCurrent != -1 )
        {
            //We need to insert all current items before this
            for ( var iNew = lastHandled + 1; iNew < indexInCurrent; iNew++ ) activeSet.insertBefore( currentSnapshot[ iNew ], old );

            //Update last handled
            lastHandled = indexInCurrent;
        }

        //Remove from active set dom
        else activeSet.removeChild( old );
    }

    //Now append all new items that weren't inserted before a remaining item
    for ( var i = lastHandled + 1, length = currentSnapshot.length; i < length; i++ ) activeSet.appendChild( currentSnapshot[ i ] );
}

getSnapshot: function()
{
    return this.allItems.slice( this.startOfActiveSet, this.startOfActiveSet + this.activeSetLength );
}
...