【问题标题】:How do I randomly shuffle an array, containing strings of names? [duplicate]如何随机打乱包含名称字符串的数组? [复制]
【发布时间】:2018-09-25 11:36:18
【问题描述】:

已经在这个问题上停留了一段时间。为乒乓球游戏生成器开发 React 项目。努力寻找一种解决方案来随机打乱用户输入的名称数组。它甚至不会 console.log 任何东西!非常感谢。

import React, { Fragment } from "react";

const FixturesList = playerNamesArray => {
    let shuffledPlayers = [...playerNamesArray];

    let arr1 = shuffledPlayers.slice(); // copy array
    let arr2 = shuffledPlayers.slice(); // copy array again

    arr1.sort(function() {
       return 0.5 - Math.random();
    }); // shuffle arrays
    arr2.sort(function() {
      return 0.5 - Math.random();
    });

    while (arr1.length) {
        let player1 = arr1.pop(), // get the last value of arr1
        player2 = arr2[0] === player1 ? arr2.pop() : arr2.shift();
        //        ^^ if the first value is the same as name1,
        //           get the last value, otherwise get the first
        console.log(player1 + " gets " + player2);
    }

    return (
        <Fragment>
             <section>
                 <h1>Fixtures</h1>
             </section>
        </Fragment>
    );
};

export default FixturesList;

【问题讨论】:

  • 为什么不随机化整个数组并从中弹出对?
  • 到底是什么问题? let arr1 = ...return () 的定义之间的所有内容都按照您的描述工作,所以问题是您的数组不包含您所说的内容,或者导入不起作用,或者返回渲染部分的反应。
  • 好点 jvdh,我有点不知道该怎么做?
  • 我现在已经纠正了 console.log 问题,但是我希望只是随机化他们从中获取对的数组。任何有关这方面的帮助都会很棒

标签: javascript reactjs random shuffle


【解决方案1】:

我喜欢使用.sortMath.random

const players = ['John', 'Jack', 'Anne', 'Marry', 'Mike', 'Jessica'];

players.sort(() => 0.5 - Math.random());

const pairs = [];

// as we need at least players to form a pair
while (players.length >= 2) { 
  const pair = [players.pop(), players.pop()];

  // Current pair
  console.log('Single pair', pair);

  // Save current pair
  pairs.push(pair);
}

// All pairs
console.log('All pairs', pairs);

我猜你已经知道了,但是 random 会返回 0 到 1 之间的数字(不包括 1),所以这个排序函数会随机返回 -0.5 到 0.5 之间的数字,对数组进行洗牌。

Pop 将返回数组中的最后一项并将其从数组中删除。我们弹出两次以获得一对。

希望有帮助!


继续评论。

要渲染它,我会创建一个组件,并将pairs 传递给它。这是 React 必不可少的,你会经常做的事情。

import React from 'react';

component Pairs extends React.component
  renderPairs() {
    // pass pairs as prop
    return this.props.pairs.map(pair => {
      return (
        <li key={ pair.join('-') }>
          { pair.join(' vs ') }
        </li>
      )
    });
  }

  return (
    <ul>
      { this.renderPairs() }
    </ul>
  )
}

// Use it like this
// <Pairs pairs={ pairs } />

【讨论】:

  • Stanko,这对朋友很有帮助,谢谢。多年来一直坚持这一点!
  • 最后一个问题,现在我们将它们配对。你认为最好的策略是在单独的元素中显示每一对,例如
  • 那是 React 101。由于我无法在评论中粘贴代码,我将编辑答案。
  • 这种排序方式不是homogeneously distributed
  • 谢谢斯坦科。我的 React 技能需要完成的工作
猜你喜欢
  • 2017-06-30
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 2018-12-10
  • 2016-09-23
相关资源
最近更新 更多