Создание и заполнение массива с фиксированной шириной в JavaScript - PullRequest
0 голосов
/ 27 февраля 2011

У меня есть входной массив в этом формате:

[[timestamp, jobid, time to completion],[..]]

данные взяты из БД SQL, сгруппированы по меткам времени и jobid, поэтому массив выглядит так:

[  
[1, 30, 400],  
[1, 31, 200],  
[2, 29, 300],  
..  
]

Я хотел бы создать новый массив с одним столбцом для каждого идентификатора задания вместо одной строки с каждым идентификатором задания, то есть одной строкой для отметки времени.

Итак, я написал некоторый код, который повторяется в указанном выше массиве, и заполнил новый массив, достаточно простой, за исключением того, что массив результатов не имеет фиксированной ширины, то есть результат выглядит следующим образом:

[  
[1, 400, 200],  
[2, 300]  
..  
]

Из-за этого я не могу сказать, что значения из [1] - это код задания 30, поэтому у меня не может быть содержательной строки заголовка. Что бы я хотел, это данные в этом формате:

timestamp, jobid29, jobid30, jobid31  
[  
[1, 0, 400, 200],  
[2, 300, 0, 0],  
..  
]

К сожалению, я не могу вывести карту.

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

Спасибо.

1 Ответ

1 голос
/ 27 февраля 2011

Мое решение использует два массива и две карты с множеством возможностей для оптимизации.Вот примерный набросок:

  1. Сортировка массива по jobID.(давайте назовем это «jobList»)

  2. Сохраните «карту», ​​на которой указаны уникальные метки времени.( "TimeStampMap").Карта должна содержать одну запись для каждой уникальной отметки времени.

  3. Сохраните еще один массив уникальных отметок времени и отсортируйте его.("timeList")

  4. Каждый элемент в "timeStampMap" хранит другую карту заданий с этим значением отметки времени

  5. Перебирать каждое значение всписок отметок времени.

    В каждой итерации выполняйте итерацию по каждому заданию в jobList.если задание находится в соответствующей карте временных отметок, выведите job.completionTime

    , в противном случае выведите ноль.

Существует два варианта оптимизации кода, который я покажу ниже.1. Скорее всего, вы можете использовать входной массив как «список заданий», не копируя его.2. Вы, вероятно, можете объединить карту карт в одну большую карту.

function jobSorter(a,b) {
    return a.jobID - b.jobID;
}

function numberSort(a,b) {
    return a - b;
}


function buildSortedArray(yourArray) {

    var index, j, item;
    var jobList = []; // array of {jobID, timeStamp, timeComp};
    var timeStampMap = {};
    var timeStampList = [];
    var key, jobkey;
    var output = [];

    // loop through every item in the array
    for (index = 0; index < yourArray.length; index++) {
        item = yourArray[index];         

        // push each item into a "job list"
        job = {jobID: item[1], timeStamp: item[0], timeComp: item[2]};
        jobList.push(job);

        // now use both a map and a list to keep track of all the unique timestamps
        key = "$timestamp$" + job.timeStamp.toString();

        if (timeStampMap[key] === undefined) {
            timeStampMap[key] = {};
            timeStampMap[key].jobMap = {};

            timeStampList.push(job.timeStamp); // keep another timestamp array that we can sort on
        }

        // add this job to the timestamp
        jobkey = "$jobid$" + job.jobID.toString();
        timeStampMap[key].jobMap[jobkey] = job;
    }

    // let's do some sorting
    timeStampList.sort(numberSort); // timeStampList is now in ascending order
    jobList.Sort(jobSorter);        // jobList is now in ascending order


    for (index = 0; index < timeStampList.length; index++) {
        item = [];

        item.push(timeStampList[index]);
        for (j = 0; j < jobList.length; j++) {

            key = "$timestamp$" + timeStampList[index].toString();
            jobkey = "$jobid$"  + jobList[j].toString();

            if (timeStampMap[key].jobMap[jobkey]) {
                item.push(timeStampMap[key].jobMap[jobkey].timeComp);
            }
            else {
              item.push(0);
            }
        }

        output.push(item);
    }


    return output;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...