JavaScript数组中的蛇形遍历

4
这可能是一个简单的答案,但我是个业余爱好者,这真的让我很头疼。我正在尝试通过遍历数组来为变量分配值。
我的代码是为Discord中的TTRPG工具机器人编写的,使用的是Discord.js。对于这个特定的功能,我想要根据输入的玩家数量掷n次属性骰,并将所有的结果汇总并排序。然后,我想要遍历排序后的数组,以便给每个玩家分配一组属性,使得每个玩家都能够达到相同的水平。
例如,如果输入的是3个玩家,则机器人将掷3组6个属性骰,并将它们汇总到一个数组中。为了方便解释,我们假设我们掷出了从1到18的所有数字。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
将被分配给
A B C C B A A B C C B A A B C C B A
因此,最终的变量将为
A = [1, 6, 7, 12, 13, 18] B = [2, 5, 8, 11, 14, 17] C = [3, 4, 9, 10, 15, 16]
我现在拥有的代码只是通过循环遍历(A, B, C, A, B, C...)来对它们进行排序,这并不能使玩家的属性平均化。我尝试了许多不同的方法来获得我需要的结果,但要么最终变量只被分配一次,导致中间变量被分配更多的属性,要么每个玩家变量只被分配一个属性。
我已经尝试在网上搜索任何帮助,但是在谷歌上搜索任何与"Javascript"和"Snake"有关的东西只会教你如何制作游戏,所以我真的希望你们能够帮助我。非常感谢你们,如果我的问题表述不清楚,我很乐意回答你们的任何问题,以便得到解答!
代码:
if (msgContent.startsWith(".dstats ")) {
  let args = msgContent.split(" ").slice(1);
  var regex = /^\d+$/;
  var statIndex = [];
  var reply;
  var forward = true;
  if(regex.test(args) && args <= 10){
    for(var i = 0; i < args*6; i++){
      statRoll();
      statIndex.push(randStat);
    };
    distSort = statIndex.sort(sortNumber);
    for( j = 0; j < args; j++){
      this['player'+j] = [];
    };
    var playIndex = 0;
    for( f = 0; f < distSort.length; f++){
      if(playIndex < args && playIndex >= 0){
        this['player'+playIndex].push(distSort[f]);
      }else {
        playIndex = 0;
        this['player'+playIndex].push(distSort[f]);
      };
      playIndex++;

    };
    reply = "Your stats blocks are as follows:\n";
    for (k = 0; k < args; k++){
      reply += "Player " + (k+1) +": [" + this['player'+k].join(', ') + "]\n";
    };
    msg.reply(reply);
  }else(
    msg.reply("Looks like you inputted an improper number or your number is too high. Check your command and try again!")
  );
}
3个回答

1
我建议在这种情况下尽可能使用JSON,因为它会使您的数据更易于处理。无论如何,以下代码应该可以解决问题:https://jsbin.com/quvexu/edit?js,console

// Declare input and output variables
arr1 = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18];
arr2 = ['a','b','c','c','b','a','a','b','c','c','b','a','a','b','c','c','b','a'];
results = {a:[], b:[], c:[]};

// Do the work
arr2.forEach(function(d,i){ results[d].push(arr1[i]); })

// Print the results 
console.log("Results", results);


谢谢!这个方法基本上按照我的要求工作,虽然我通过一些混乱而可能多余的代码使它能够运行,但至少我终于让它工作了,之后我可以整理一下我的脚本。我只是需要让数字可以变化。所以如果用户输入'4',arr1中会有24个值,arr2会从'a'变到'd'。根据用户的输入,一切都可以变化。 - TheWalrusEffect

1
你可以迭代所需部分的长度和部分数量,然后取得偶数和奇数部分的计算值。

var length = 6,
    lines = 3,
    result = [],
    i, j;
    
for (i = 0; i < length; i++) {
    for (j = 0; j < lines; j++) {
        result[j] = result[j] || [];
        result[j].push(i * lines + (i % 2 ? lines - j : j + 1));
    }
}

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


1
你可以按照以下步骤操作。它将处理n个玩家,并按照您描述的顺序为每个玩家分配6点。

function dealPoints(c){
  var nums = Array(6*c).fill().map((_,i) => i+1);
  return nums.reduce(function(r,n,i){
                       var j = i%c;
                       j === 0 && (r.switch = !r.switch);
                       r.switch ? r[j].push(n) : r[c-j-1].push(n);
                       return r;
                     }, Array(c).fill().map(_ => []));
}
var players = 3,
     result = dealPoints(players);

console.log(result);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接