Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将数字列表转换为两个数字的唯一对_Javascript_Arrays_Algorithm - Fatal编程技术网

Javascript 如何将数字列表转换为两个数字的唯一对

Javascript 如何将数字列表转换为两个数字的唯一对,javascript,arrays,algorithm,Javascript,Arrays,Algorithm,我需要将一个长度未知的随机整数数组转换为多对2 例: var数字=[1,5,0,7,5,5,1,7,5,1,2,1]; ----------------------------------------------------- [[1, 5], [0, 7], [5, 5], [1, 7], [5, 1], [2, 1]] 需要遵循一些约束条件,例如: 应该正好有6对(每对2个数字) 如果numbers数组中没有足够的数字组成6对,则生成一个介于1-9之间的数字 数字数组中的每个项目只能使用

我需要将一个长度未知的随机整数数组转换为多对2

例:

var数字=[1,5,0,7,5,5,1,7,5,1,2,1];
-----------------------------------------------------
[[1, 5], [0, 7], [5, 5], [1, 7], [5, 1], [2, 1]]
需要遵循一些约束条件,例如:

  • 应该正好有6对(每对2个数字)
  • 如果
    numbers
    数组中没有足够的数字组成6对,则生成一个介于1-9之间的数字
  • 数字
    数组中的每个项目只能使用一次
  • 每对都必须是唯一的。但是,例如
    [1,2]
    [2,1]
    可以视为不同的对
  • 一对不能包含
    [0,0]
到目前为止,我发现了一个可以查找组合的函数,但一旦使用了索引,它就不会忽略它

var数字=[1,5,0,7,5,5,1,7,5,1,2,1];
函数p(t,i){
如果(t.length==2){
结果:推(t);
返回;
}
如果(i+1>数字.长度){
返回;
}
p(t.concat(数[i]),i+1);
p(t,i+1);
}
var结果=[];
p([],0);
控制台日志(结果);

下一步该怎么办?

您可以进行一些循环,一个用于检查结果集的长度,一个用于检查是否有
数组
的可用值,并添加值以获取下一对,并检查该对之前是否见过

如果没有,则将该对添加到结果集中并继续

var getRandomN=n=>()=>Math.floor(Math.random()*n)+1,
getRandom=getRandomN(9),
数组=[1,5,0,7],
SEED=新集合(['0 | 0']),
长度=6,//指定所需的长度
结果=[],
i=0,
一对
while(result.length
.as console wrapper{max height:100%!important;top:0;}
虽然OP只需要未知长度数组中的前N对可能是正确的,但这里有一个额外的检查(和解决该问题的一种稍微不同的方法):

constnums1=[1,5,0,7,5,5,1,7,1,5,1,5];
常量nums2=[1,5,0,7,5,5,1,7,5,1,2,1];
常量nums3=[1,5,0,7,5,5,0,0,5,1,2,1,0,0,1,8];
常量nums4=[1,5,0,7,1,6,5,5,0,0,5,8,8,5,5,1,2,1,0,0,1,8];
const log=pairs=>console.log(JSON.stringify(pairs));
日志(createPairs(nums1,6));
日志(createPairs(nums2,6));
日志(createPairs(nums3,6));
日志(createPairs(nums4,5));
日志(createPairs(nums4,5,true));
函数createPairs(数字、len、truncate){
让配对=[];
设i=0;
const existingValues=新集合(['0 | 0']);
const randomDigit=n=>Math.floor(Math.random()*(n+1));
//创建并完成[len]唯一对的数组,而不是[0,0]
while(pairs.lengthconst pair=i+2如何生成随机数?使用Math.random(),一个介于1-9之间的数字。谢谢你,尼娜,你能给这些行添加一些注释吗。我很想了解循环中发生了什么。嗨,尼娜,你的代码将在结果中返回
[0,0]
-值,可以使用
seen=new Set规避这些值(['0 | 0']),
同样,它会将更长的数组像
[[1,5],[0,7],[1,6],[5,5],[5,8],[8,5],[5,1],[2,1]
剪切到
长度,这可能不是期望的结果;)op只需要6对。但是op需要前6对吗?请解释你的答案。这个代码更接近我想要的,谢谢。
var numbers = [1, 5, 0, 7, 5, 5, 1, 7, 5, 1, 2, 1];
var arr = [];
numbers.forEach(function (x, i) {
  if(i % 2) {
    arr[arr.length-1][1] = x;
    console.log(arr[arr.length-1]);
  }
  else {
    arr.push([x, null]);
  }
});
console.log(arr.join("#"));