如何在Javascript

时间:2019-01-05 01:40:31

标签: javascript arrays json

我有一个具有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函数,一旦我找到一种可以实现我想要的功能的函数,便可以执行此操作。

3 个答案:

答案 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;
    }
}