我有一个具有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函数,一旦我找到一种可以实现我想要的功能的函数,便可以执行此操作。
答案 0 :(得分:1)
如果您要谈论随机改组数组,请按照以下步骤操作:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if self.isMovingFromParent {
// Your code...
}
}
取自here
的答案答案 1 :(得分:0)
无论何时创建新对象,声明其属性的顺序就是它们打印到控制台时的显示顺序或通过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 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.log(list.map(remap))
并且,假定给定列表中每个项目的键顺序都应该相同,一种方法是将管理随机化的代码封装在用作闭包的函数中。追求功能性构造,因为它使代码更紧凑。
{{1}}
答案 2 :(得分:0)
晚会晚了。
由于您希望完全随机,因此如何使用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.log(list2);
console.log(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;
}
}