#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);