Как перебирать список и связывать ссылки на связанные элементы?

#javascript

#язык JavaScript

Вопрос:

Предположим, у меня есть список объектов

Я хочу повторить этот список и связать объект dailyBalance с его ежедневными транзакциями, а затем добавить количество транзакций в объект dailyBalance.

Я попытался сделать это, выполнив итерацию по списку, и если я нашел объект типа dailyBalance, я приостанавливаю текущий запущенный цикл, затем создаю вложенный цикл и нахожу объекты типа transaction и прерываю этот вложенный цикл, как только нахожу другой объект типа dailyBalance. Это должно сработать, но работает не так, как ожидалось.

 for (let position = 0; position lt; data.length;   position) {  const item = data[position];  if (item.type == "dailyBalance") {  for (let i = position - 1; i gt;= 0; i--) {  if (data[i].type == "dailyBalance") {  break;  } else {  data[position].txCount = data[position].txCount   1;  data[i].balanceRef = data[position];  }  }  } } console.log(data) 
 lt;scriptgt; const data = [  {type: "transaction", balanceRef: null },  {type: "transaction", balanceRef: null },  {type: "transaction", balanceRef: null },  // B2 - Balance Node 2  {type: "dailyBalance", txCount: 0 }, //txCount 2 //B2,  {type: "transaction", balanceRef: null }, //B2,  {type: "transaction", balanceRef: null }, //B2,  // B1 - Balance Node 1  {type: "dailyBalance", txCount: 0 }, //txCount 4 //B1,  {type: "transaction", balanceRef: null }, //B1,  {type: "transaction", balanceRef: null }, //B1,  {type: "transaction", balanceRef: null }, //B1,  {type: "transaction", balanceRef: null } //B1, ] lt;/scriptgt; 

Ожидаемый результат

 [  { type: "transaction", balanceRef: null },  { type: "transaction", balanceRef: null },  { type: "transaction", balanceRef: null },  { type: "dailyBalance", txCount: 2 }, //txCount 2 //B2,  { type: "transaction", balanceRef: lt;balance object B2gt; },   { type: "transaction", balanceRef: lt;balance object B2gt; },   { type: "dailyBalance", txCount: 4 }, //txCount 4 //B1,  { type: "transaction", balanceRef: lt;balance object B1gt; },   { type: "transaction", balanceRef: lt;balance object B1gt; },   { type: "transaction", balanceRef: lt;balance object B1gt; },   { type: "transaction", balanceRef: lt;balance object B1gt; }  ];  

Комментарии:

1. @mplungjan Нитеш правильно понял это в своем ответе ниже, но он забыл связать ссылку, но я внес изменения в его код data[i].balanceRef = data[itemIndex]; . Я действительно ужасно объясняю алгоритмы.

2. @mplungjan, если можете, добавьте его функциональную версию. Мне понравился ваш ответ на сокращение, но вы его удалили ..

3. Я его восстановил. Если вам это нравится, вы должны проголосовать за это и, пожалуйста, пожалуйста, покажите, как должен выглядеть результат, чтобы я мог обновить свой код

4. @Nitheesh Вы можете запустить код Nitesh и свой, а затем сравнить выходные данные, потому что его код правильно выводит точный формат, который я хотел. Я просто не думаю, что смогу описать объекты JS простым текстом.

5. @mplungjan Я только что внес правку в ваш ответ, чтобы ответить, что добавить ??? ценность. Мне действительно жаль, что я не могу его напечатать ??? поля, но Я НЕ МОГУ.

Ответ №1:

Мы могли бы использовать сокращение

Примечание. Я проверяю сохраненный индекс, потому что 0 является ложным, поэтому, если массив начинается с ежедневного баланса, код завершится ошибкой, если я не проверю

 let savedIndex; const reduced = data.reduce((acc, cur, i) =gt; {  acc.push(cur);  if (cur.type === "transaction") {  if (savedIndex != null) {  acc[savedIndex].txCount  ;   acc[acc.length-1].balanceRef = acc[savedIndex]; // save a reference to the balance objecct   // acc[acc.length-1].balanceRef = savedIndex; // save the index of the balance object  }   }  if (cur.type === "dailyBalance") savedIndex = i;  return acc; }, [])  console.log(reduced) 
 lt;scriptgt; const data = [  {type: "transaction", balanceRef: null },  {type: "transaction", balanceRef: null },  {type: "transaction", balanceRef: null },  {type: "dailyBalance", txCount: 0 }, //txCount 2 //B2,  {type: "transaction", balanceRef: null }, //B2,  {type: "transaction", balanceRef: null }, //B2,  {type: "dailyBalance", txCount: 0 }, //txCount 4 //B1,  {type: "transaction", balanceRef: null }, //B1,  {type: "transaction", balanceRef: null }, //B1,  {type: "transaction", balanceRef: null }, //B1,  {type: "transaction", balanceRef: null } //B1, ] lt;/scriptgt; 

Ответ №2:

Простой цикл for может вам помочь.

Логические

  • Цикл по массиву данных
  • Проверка type каждого объекта
  • Если type это dailyBalance , сохраните этот индекс в переменной.
  • Начиная со следующего индекса и далее увеличивайте txCount объект с ранее сохраненным индексом.
  • Это увеличит txCount размер выделенного объекта до dailyBalance тех пор, пока не будет найден следующий.
  • Также свяжите balanceRef следующие ближайшие узлы с выбранной целью.
 const data = [{ type: "transaction", balanceRef: null }, { type: "transaction", balanceRef: null }, { type: "transaction", balanceRef: null }, { type: "dailyBalance", txCount: 0 }, { type: "transaction", balanceRef: null }, { type: "transaction", balanceRef: null }, { type: "dailyBalance", txCount: 0 }, { type: "transaction", balanceRef: null }, { type: "transaction", balanceRef: null }, { type: "transaction", balanceRef: null }, { type: "transaction", balanceRef: null }]; let itemIndex = null; for(let i = 0; i lt; data.length; i  ) {  if(data[i].type === 'dailyBalance') {  itemIndex = i;  } else if(itemIndex !== null) {  data[i].balanceRef = data[itemIndex];    data[itemIndex].txCount;  } } console.log(data); 

Некоторые функциональные стили

Array.map реализация

 const data = [{ type: "transaction", balanceRef: null }, { type: "transaction", balanceRef: null }, { type: "transaction", balanceRef: null }, { type: "dailyBalance", txCount: 0 }, { type: "transaction", balanceRef: null }, { type: "transaction", balanceRef: null }, { type: "dailyBalance", txCount: 0 }, { type: "transaction", balanceRef: null }, { type: "transaction", balanceRef: null }, { type: "transaction", balanceRef: null }, { type: "transaction", balanceRef: null }]; let referenceNode = null; const output = data.map((node) =gt; {  if (node.type === "dailyBalance") {  referenceNode = node;  } else if (referenceNode !== null) {    referenceNode.txCount;  node.balanceRef = referenceNode;  }  return node; }); console.log(output); 

Array.reduce реализация.

 const data = [{ type: "transaction", balanceRef: null }, { type: "transaction", balanceRef: null }, { type: "transaction", balanceRef: null }, { type: "dailyBalance", txCount: 0 }, { type: "transaction", balanceRef: null }, { type: "transaction", balanceRef: null }, { type: "dailyBalance", txCount: 0 }, { type: "transaction", balanceRef: null }, { type: "transaction", balanceRef: null }, { type: "transaction", balanceRef: null }, { type: "transaction", balanceRef: null }]; let referenceNode = null; const output = data.reduce((acc, curr) =gt; {  if(curr.type === "dailyBalance") {  referenceNode = curr;  } else if (referenceNode !== null) {    referenceNode.txCount;  curr.balanceRef = referenceNode;  }  acc.push(curr);  return acc; }, []); console.log(output);