У меня есть массив объектов с 11 свойствами, и я хочу случайным образом перемешать свойства, появляющиеся в массиве.
Для ясности, порядок объектов массива будет таким же. Я хочу рандомизировать порядок свойств внутри объекта и сохранить этот порядок для каждого объекта.
Вот образец моего массива:
Я попытался найти любое другое решение аналогичных проблем, но большинство из них меняли объект, тогда как мне нужно рандомизировать свойства
var list = [
{
"ID": 0,
"Name": "Mark",
"Address": "2323 st",
"Phone": 511 232 2000,
"Score": 345
},
{
"ID": 1,
"Name": "Catrina",
"Address": "2323 st",
"Phone": 511 232 2100,
"Score": 3452
} //and 1000 more objects...
И это то, что я ищу (порядок должен быть изменен при нажатии кнопки)
var list2 = [
{
"Score": 345
"Name": "Mark",
"Address": "2323 st",
"ID": 0,
"Phone": 511 232 2000,
},
{
"Score": 3452
"Name": "Catrina",
"Address": "2323 st",
"ID": 1,
"Phone": 511 232 2100,
} //and 1000 more objects...
Я хочу получить вывод list2 с теми же данными, но в случайном порядке свойств. Функция randomize будет вызываться всякий раз, когда кто-то нажимает кнопку, это я смогу сделать, как только найду способ, чтобы функция делала то, что я хочу.
просто так я понимаю - порядок свойств для каждого объекта одинаков для всех объектов в массиве в list2 - или свойства каждого объекта рандомизированы индивидуально?
Я пробовал много вещей, но не придерживался определенного решения, поэтому я не публиковал код. Я продолжу над чем-то работать и опубликую, когда станет чище.
Да, порядок свойств будет одинаковым для каждого объекта в списке 2



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если вы говорите о случайном перемешивании массива, ниже описано, как это сделать:
function shuffle(array) {
var 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;
}
Ответ взят от здесь
Я пробовал код, но не могу заставить его работать. Разве это не простой массив, тогда как у меня есть массив с несколькими свойствами? Я могу ошибаться, поскольку я новичок в js.
OP - это нет, пытающийся перетасовать свой массив. ES6 + действительно гарантирует порядок собственности объекта.
Каждый раз, когда вы создаете новый объект, порядок, в котором вы объявляете его свойства, соответствует порядку, в котором они появляются при выводе на консоль, или в строковом формате через JSON.stringify ().
var list = [
{
"ID": 0,
"Name": "Mark",
"Address": "2323 st",
"Phone": "511 232 2000",
"Score": 345
},
{
"ID": 1,
"Name": "Catrina",
"Address": "2323 st",
"Phone": "511 232 2100",
"Score": 3452
}]
function remap(d) {
const {ID, Name, Address, Phone, Score} = d;
return {Score, Name, Address, ID, Phone}
}
console.info(list.map(remap))И, предполагая, что порядок ключей должен быть одинаковым для каждого элемента в данном списке, один из подходов состоит в том, чтобы заключить код, управляющий рандомизацией, внутри функции, работающей как закрытие. Переход к функциональным конструкциям, поскольку это делает код более компактным.
var list = [{
"ID": 0,
"Name": "Mark",
"Address": "2323 st",
"Phone": "511 232 2000",
"Score": 345
},
{
"ID": 1,
"Name": "Catrina",
"Address": "2323 st",
"Phone": "511 232 2100",
"Score": 3452
}
]
function randomizePropertyOrder() {
// If we want the property order to remain the same throughout the list
// we must declare it inside some closure
let propsOrder;
// quick way to randomize any list of items.
function randomizeList(list) {
return list
.map((k, i) => { return { k, i: Math.random(); } })
.sort((a, b) => { return a.i - b.i; })
.map((d) => { return d.k; })
}
return (d) => {
// let's compute a random property order once and only once
if (propsOrder === undefined) { propsOrder = randomizeList(Object.keys(d)) }
return propsOrder.reduce((acc, k) => {
acc[k] = d[k];
return acc;
}, {})
}
}
const remap = randomizePropertyOrder()
console.info(list.map(remap))Он должен быть полностью случайным, но я мог бы заставить его работать примерно с 5 случаями возврата с генератором случайных чисел с вашим решением. Я протестировал его, и он работает как шарм. Я мог бы использовать это решение. Спасибо
@ user10840968 Я добавил быстрый способ перемешать порядок свойств случайным образом, при этом порядок свойств остается одинаковым для всех элементов в списке. Я закодировал его так, чтобы вы могли применять один и тот же (случайный) порядок к разным спискам, повторно используя одну и ту же функцию переназначения.
Немного поздно на вечеринку.
Как насчет использования Durstenfeld shuffle, если вы хотите полностью случайного. Это оптимизировано для компьютера, так как ваш список может быть длинным, и вы не хотите, чтобы основной поток блокировался / замедлялся.
var list = [
{
"ID": 0,
"Name": "Mark",
"Address": "2323 st",
"Phone": 5112322000,
"Score": 345
},
{
"ID": 1,
"Name": "Catrina",
"Address": "2323 st",
"Phone": 5112322100,
"Score": 3452
}
];
var list2 = list.slice();//making replica
randomizeList(list2);
console.info(list2);
console.info(list);
function randomizeList(list2) {
for (var i = list2.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = list2[i];
list2[i] = list2[j];
list2[j] = temp;
}
}
У вас есть четко сформулированная проблема, это хорошо - не могли бы вы опубликовать написанный вами код, который не работает должным образом, чтобы мы могли увидеть, что идет не так? (ТАК не здесь, чтобы писать за вас весь сценарий)