цикл по 2 файлам Json с каждыми 200k записями в них - PullRequest
2 голосов
/ 14 июня 2019

У меня есть 2 больших файла json с каждыми 200k объектами, и когда я пытаюсь выполнить цикл между 2 jsons для общего идентификатора, это занимает больше времени для выполнения.

Реализация 1

for (var i in matterData.data) {
  const fobj = matterData.data[i];

  const  ma_array = [];
  for (var j in activityData.data) {
    const aobj = activityData.data[j];
    if (fobj.id === aobj.matter.id) {
      ma_array.push(aobj);
    }
    if (ma_array.length > 0) fobj.activities = ma_array;
  }
}

Реализация 2

for (var i in matterData.data) {
  //Activities
  matters_array = [];
  matters_array = activityData.data.filter(function (el) {
    if (el.matter !== null) return el.matter.id == matterData.data[i].id;
  });
  if (matters_array.length > 0) matterData.data[i]["activities"] = matters_array;
}

Реализация 3

for (var i in matterData.data) {
  matters_array = [];

  for (var j in activityData.data) {
    if (activityData.data[j]["matter"] !== null) {
        if (matterData.data[i].id === activityData.data[j]["matter"].id) {
            matters_array.push(activityData.data[j]);
        }
        if (matters_array.length > 0) matterData.data[i]["activities"] = matters_array;
    }
  }
}

Каждая реализация требует больше времени для выполнения.

ДеятельностиData будет иметь идентификатор, а такжеity.id, который связан с Материалом_данных.id

Любые идеи, пожалуйста, помогите

Данные по вопросам


var matterData= {
  "data": [
    {
      "id": 1055395769,
      "description": "Peters",
      "status": "Pending",
      "location": null,
      "client_reference": "1532",
      "billable": true,
      "billing_method": "hourly",
      "open_date": "2019-06-05",
      "close_date": null,
}

]
};

Данные о деятельности

var activityData = {
  "data": [
    {
      "id":285568423,
      "type": "ExpenseEntry",
      "date": "2011-01-01",
      "quantity_in_hours": 1,
      "rounded_quantity_in_hours": 1,
      "quantity": 1,
      "rounded_quantity": 1,
      "price": 100,
      "matter": {
        "id": 1055395769
      }
      },
      {
      "id": 285568428,
      "type": "MonEntry", 
      "matter": {
        "id": 1055395769
      }
      },
      {
      "id": 285568442,
      "type": "EEntry", 
      "matter": {
        "id": 1055395769
      }}]
    };


Ответы [ 4 ]

1 голос
/ 14 июня 2019

Сначала создайте карту, содержащую id в качестве ключа, и material.data в качестве значения, и создайте пустой массив для acitvity, затем выполните итерацию по активности и переместите активность в пустой массив

const map = {}
for( var i in matterData.data){
  map[matterData.data[i].id] = matterData.data[i];
  matterData.data[i].activities = [];
}

for(var i in activityData.data){
 var matter = map[activityData.data[i].matter.id];
 matter.activities.push(activityData.data[i]);
}
for( var i in matterData.data){
  console.log(matterData.data[i]);
}

Это решение работает, только еслиматериальный_данных.дата [i] .id является уникальным

0 голосов
/ 15 июня 2019

Set.has - O (1), который, я думаю, может эффективно использоваться для этой цели.

var subSet = new Set(activityData.data.map(obj => {obj.matter.id}));


for (var i in matterData.data) {

  const  ma_array = [];
  if (subSet.has(matterData.data[i].id){

     ...
  }  

}
0 голосов
/ 14 июня 2019

Реализация ответ с ruhul

const map = Object.create(null);
const res = [];

// Store all values of matterData.data in map with id.
matterData.data.forEach(item => (map[item.id] = item));

//  iterate over one  activityData.data to check if the id exists in map.
activityData.data.forEach(item => {
  const { id } = item;
    if (map[id]) {
    res.push(item);
   }
});
0 голосов
/ 14 июня 2019

Вы выполняете цикл O (n ^ 2), который составляет цикл 200000 * 200000. Это огромный расчет для обработки. Вы можете уменьшить эту сложность, используя карту. Сохранить все значения activityData.data на карте с идентификатором. Затем выполните итерацию одного matterData.data, чтобы проверить, существует ли идентификатор на карте.

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