如何在JavaScript中调整一系列对象



下面的代码适用于普通数组,但与对象的数组不知道吗?

const array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
function shuffle(array) {
  for (let i = array.length - 1; i > 0; i--) {
    let j = Math.floor(Math.random() * (i + 1));
    let temp = array[i];
    array[i] = array[j];
    array[j] = temp;
  }
  return array;
}
const result = shuffle(array);
console.log(JSON.stringify(result));

尝试类似此片段的分类:

console.log( [
    { some: 1 },
    { some: 2 },
    { some: 3 },
    { some: 4 },
    { some: 5 },
    { some: 6 },
    { some: 7 },
  ]
  .sort( () => Math.random() - 0.5) );

回复马丁·奥曼斯(Martin Omanders(评论:根据Fisher-Yates算法,这是一种洗牌方法

const result = document.querySelector("pre");
for (let i=0; i<20; i+=1) {
  result.textContent += 
    JSON.stringify(shuffleFisherYates([0,1,2,3,4,5,6,7,8,9])) + 'n';
}
function shuffleFisherYates(array) {
  let i = array.length;
  while (i--) {
    const ri = Math.floor(Math.random() * i);
    [array[i], array[ri]] = [array[ri], array[i]];
  }
  return array;
}
<pre></pre>

可能会凝结到一个衬里( Note :此衬里不会在Google Clos Clasture编译器中编译,而级别则是高级的(:

const shuffle = array => 
  [...Array(array.length)]
    .map((el, i) => Math.floor(Math.random() * i))
    .reduce( (a, rv, i) => ([a[i], a[rv]] = [a[rv], a[i]]) && a, array);
const result = document.querySelector("pre");
for (let i=0; i<100; i+=1)
  result.textContent +=
   JSON.stringify(shuffle([0,1,2,3,4,5,6,7,8,9])) + 'n';
<pre></pre>

这是一个基于lodash _。Shuffle的另一个示例。

const array = [
    { some: 1 },
    { some: 2 },
    { some: 3 },
    { some: 4 },
    { some: 5 },
    { some: 6 },
    { some: 7 },
  ];
console.log(_.shuffle(array));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

如果您需要调整元素节点集合(在DOM中(,请先将其转换为数组:

var wrapper = document.getElementById('someid');
var array = Array.prototype.slice.call(wrapper.children);

改组HTMLCollection对象(children返回(即使您可以用for循环迭代集合,也无法正常工作。这偶然发现了我一段时间。

我没有足够的声誉点来评论,但是 @koolinc在Fisher-Yates算法上更新功能在编写时在循环中有错误。它会创建一个无限的循环,因为While循环永无止境。这是更新的功能:

function shuffleFisherYates(array) {
  let i = array.length;
  while (i > 0) {
    const ri = Math.floor(Math.random() * i);
    i--;
    [array[i], array[ri]] = [array[ri], array[i]];
  }
  return array;
}

相关内容

  • 没有找到相关文章

最新更新