Как эффективно искать и получать элемент из массива объектов, используя для каждого цикла? - PullRequest
0 голосов
/ 30 августа 2018

У меня есть 3 массива, давайте их назовем, A, B и C. A и B - это массивы строк, а C - это массив объектов.

A = ['Geography1', 'Geography2', 'Geography3', ...];//length will range from 100 to 500.
B = ['Jan 2018', 'Feb 2018', 'Mar 2018' ...];//length will range from 12 to 36.
C = [
   {"geoName": "Geography1", "month": "Jan 2018", "sales": 1, "growth": 12.11, "marketShare": 13.11},
{"geoName": "Geography1", "month": "Feb 2018", "sales": 2, "growth": 22.22, "marketShare": 23.22},
....
....
....
{"geoName": "Geography2", "month": "Jan 2018", "sales": 3, "growth": 33.33, "marketShare": 12.4},
{"geoName": "Geography2", "month": "Feb 2018", "sales": 4, "growth": 23.45, "marketShare": 12.4},
....
....
....
....
]; length will be A.length * B.length, approximately it will range from 1,200 to 18,000.

Используя эти массивы и основываясь на «продажах» или «росте», мне нужно сгенерировать другой массив, скажем, D, который должен иметь следующий формат (показанные значения для «продаж», если мы фильтруем по росту, росту значения должны быть показаны снова для каждой географии \ месяца), используя для или для каждого цикла:

D = [
{"geoName":"Geography1", "Jan 2018": 1, "Feb 2018":2,....},
{"geoName":"Geography2", "Jan 2018": 3, "Feb 2018":4,....},
....
...

....
];

В настоящее время мой код выглядит так, но он неэффективен для больших наборов данных. Выполнение занимает много времени:

function formatData(){
    D = [];
    var displayBy = "sales"; //or "growth"
    for each(geoDesc in A)
            {
                var row = {};
                row['geoName']= geoDesc;

                var val:Number;


                for each(var month:String in B)
                {

                    val = getValue(C, month, geoDesc, displayBy)
                    row[month] = val;

                }

                D.push(row);
            }
//D here will have final output
}

function getValue(source:Array, month:String, geoDesc:String,displayBy:String):Number
            {
                var value:Number = 0;
                var len:int = source.length;
                for(var i:int = 0; i < len; i++)
                {
                    var item:Object = source[i];
                    if(item['month'] == month && item['geoName'] == geoDesc)
                    {
                        value = item[displayBy];
                        break;
                    }
                }

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