Ладно, ребята, я тут совсем запутался. Небольшой обзор того, что я здесь делаю, я извлекаю документы из MongoDB с помощью Mongoose. Вот пример массива объектов, возвращаемых запросом мангуста:
[
{
"_id": "5fdd2f26724b95367bb08557",
"buyer": "5f976504231cd73151dcdc28",
"project": "5fa30ee658eba14ca75eb69c",
"createdBy": "5fdbd0f42d8fb4348f3136fd",
"createdAt": "2020-12-18T22:37:26.170Z",
"updatedAt": "2020-12-18T22:37:26.170Z",
"__v": 0
},
{
"_id": "5fdd3216724b95367bb0856f",
"buyer": "5f976504231cd73151dcdc28",
"project": "5fa30ee658eba14ca75eb69c",
"createdBy": "5fdbd0f42d8fb4348f3136fd",
"createdAt": "2020-12-18T22:49:58.320Z",
"updatedAt": "2020-12-18T22:49:58.320Z",
"__v": 0
}
]
После извлечения я рандомизирую их с помощью функции стиля Фишера-Йейтса:
async function randomizer(array){
let currentIndex = array.length, temporaryValue, randomIndex;
// While there remain elements to shuffle...
while (0 !== currentIndex) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
// And swap it with the current element.
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
}
Затем я беру этот рандомизированный массив и перебираю его циклом for:
for(let i = 0; i < reservations.length; i++){
reservations[i].randomizedOrder = i; // Store randomized order in array
}
Но объекты в массиве по-прежнему выглядят так, без добавления поля randomizedOrder:
{
"_id": "5fdd3216724b95367bb0856f",
"buyer": "5f976504231cd73151dcdc28",
"project": "5fa30ee658eba14ca75eb69c",
"createdBy": "5fdbd0f42d8fb4348f3136fd",
"createdAt": "2020-12-18T22:49:58.320Z",
"updatedAt": "2020-12-18T22:49:58.320Z",
"__v": 0
}
Вот по порядку:
const options = {
query: { project: "5fa30ee658eba14ca75eb69c" },
populate: [],
pagination: { limit: 0, skip: 0 },
sort: {},
};
const reservations = await this.dbService.read('Reservation', options);
const arr = reservations.data;
function randomizer(array) {
let currentIndex = array.length,
temporaryValue, randomIndex;
// While there remain elements to shuffle...
while (0 !== currentIndex) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
// And swap it with the current element.
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
}
const shuffledReservations = randomizer(arr);
for(let i = 0; i < shuffledReservations.length; i++){
arr[i].shuffledReservations = i; // Store randomized order in array
}
Я добавил строку console.info() в цикл for, и цикл for определенно работает, поскольку он выдает console.infos, но он просто не добавляет свойство randomizedOrder в резервирование. Что я здесь делаю неправильно?
и каков ваш ожидаемый результат?
вам не нужно ключевое слово await для вызова рандомизатора! а также удалить ключевое слово async из объявления функции.
если вы не ожидали такого результата и у вас возникли проблемы с реализацией, оставьте комментарий!
let arr = [{
"_id": "5fdd2f26724b95367bb08557",
"buyer": "5f976504231cd73151dcdc28",
"project": "5fa30ee658eba14ca75eb69c",
"createdBy": "5fdbd0f42d8fb4348f3136fd",
"createdAt": "2020-12-18T22:37:26.170Z",
"updatedAt": "2020-12-18T22:37:26.170Z",
"__v": 0
},
{
"_id": "5fdd3216724b95367bb0856f",
"buyer": "5f976504231cd73151dcdc28",
"project": "5fa30ee658eba14ca75eb69c",
"createdBy": "5fdbd0f42d8fb4348f3136fd",
"createdAt": "2020-12-18T22:49:58.320Z",
"updatedAt": "2020-12-18T22:49:58.320Z",
"__v": 0
}
];
function randomizer(array) {
let currentIndex = array.length,
temporaryValue, randomIndex;
// While there remain elements to shuffle...
while (0 !== currentIndex) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
// And swap it with the current element.
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
console.info(array)
return array;
}
for(let i = 0; i < arr.length; i++){
arr[i].randomizedOrder = i; // Store randomized order in array
}
const shuffledReservations = randomizer(arr);
почему вы используете асинхронную функцию?