Повторяющийся результат при зацикливании данных в Adonisjs - PullRequest
0 голосов
/ 16 марта 2020

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

"detail": [
        {
            "qty": 2,
            "price": 1000,
            "item_id": "1"
        },
        {
            "qty": 5,
            "price": 100000,
            "item_id": "2"
        }
    ]

это первый зацикливание процесса для создания detail_id :


const detail = request.input("detail");
const history = request.input("detail");

            for (var i = 0; i < detail.length; i++) {
                if(!detail[i].detail_id) {
                    detail[i].detail_id = nanoid(21);
                }
                console.log(detail[i]);
                //output:
                // [
                   // {
                      // "qty": 2,
                      // "price": 1000,
                      // "item_id": "1",
                      // "detail_id": "fDRS0NIaoNoS9kiauypjy"
                   // },
                   // {
                      // "qty": 5,
                      // "price": 100000,
                      // "item_id": "2",
                      // "detail_id": "fDRS0NIaoNoS9kiauypjy"
                   // }
                 //]
             }

второй цикл для создания history_id :

             for (var x = 0; x < history.length; x++) {
                if(!history[x].history_id) {
                    history[x].history_id = nanoid(21);
                }
                console.log(history[x]);
                //output:
                // [
                   // {
                      // "qty": 2,
                      // "price": 1000,
                      // "item_id": "1",
                      // "detail_id": "fDRS0NIaoNoS9kiauypjy"
                   // },
                   // {
                      // "qty": 5,
                      // "price": 100000,
                      // "item_id": "2",
                      // "detail_id": "fDRS0NIaoNoS9kiauypjy"
                   // }
                 //]
             }

результат второго цикла все тот же с первым циклом, что не так с этим кодом?

const requestInput = [{
    "qty": 2,
    "price": 1000,
    "item_id": "1"
  },
  {
    "qty": 5,
    "price": 100000,
    "item_id": "2"
  }
];

const detail = requestInput;
const history = requestInput;

function nanoid(id) {
  return 'fDRS0NIaoNoS9kiauypjy';
}

for (var i = 0; i < detail.length; i++) {
  if (!detail[i].detail_id) {
    detail[i].detail_id = nanoid(21);
  }
}
console.log(detail);

for (var x = 0; x < history.length; x++) {
  if (!history[x].history_id) {
    history[x].history_id = nanoid(21);
  }
}
console.log(history);

1 Ответ

0 голосов
/ 16 марта 2020

Вам необходимо сделать ГЛУБОКИЕ копии данных, которые вы передаете. Сейчас и детали, и история указывают на один и тот же объект. Использование [... data] создаст мелкую копию. Этого будет недостаточно, поскольку у нас есть вложенные данные. Loda sh - это популярный инструмент для глубокого копирования: https://lodash.com/

let data = [
  {
    qty: 2,
    price: 1000,
    item_id: "1"
  },
  {
    qty: 5,
    price: 100000,
    item_id: "2"
  }
];

// These are both referencing the same object
const detail = data;
const history = data;

for (var i = 0; i < detail.length; i++) {
  if (!detail[i].detail_id) {
    detail[i].detail_id = 10;
  }
}
console.log(detail);
// The first loop is adding on detail_id
// [ { qty: 2, price: 1000, item_id: '1', detail_id: 10 },
//   { qty: 5, price: 100000, item_id: '2', detail_id: 10 } ]


for (var x = 0; x < history.length; x++) {
  if (!history[x].history_id) {
    history[x].history_id = 10;
  }
}
console.log(history);

// The second loop adds on history_id
// [ { qty: 2,
//     price: 1000,
//     item_id: '1',
//     detail_id: 10,
//     history_id: 10 },
//   { qty: 5,
//     price: 100000,
//     item_id: '2',
//     detail_id: 10,
//     history_id: 10 } ]
...