Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.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_Count_2d_Unique - Fatal编程技术网

Javascript在出现唯一值时停止推送

Javascript在出现唯一值时停止推送,javascript,arrays,count,2d,unique,Javascript,Arrays,Count,2d,Unique,我用while循环填充二维数组,但是当第一列包含3个不同的唯一值时,我需要停止推送 开始是这样的 var maxunique; var i = 0; while (countunique(arr) != maxunique) { // my code that push data into array arr[i].push(RandomNumber(1,8)); arr[i].push(i+1); i++; } function countunique(arr)

我用while循环填充二维数组,但是当第一列包含3个不同的唯一值时,我需要停止推送

开始是这样的

var maxunique;
var i = 0;

while (countunique(arr) != maxunique) {

    // my code that push data into array
    arr[i].push(RandomNumber(1,8));
    arr[i].push(i+1);
i++;
}


function countunique(arr)
{
    // function here
}

function RandomNumber(min,max)
{
    return Math.floor(Math.random()*(max-min+1)+min);
}
这将返回该值

arr:  [ [ 4, 1 ],
  [ 7, 2 ],
  [ 5, 3 ],
  [ 5, 4 ],
  [ 3, 5 ],
  [ 1, 6 ],
  [ 7, 7 ],
  [ 8, 8 ],
  [ 5, 9 ],
  [ 5, 10 ] ]
关于预期结果的想法是什么

arr:  [ [ 4, 1 ],
  [ 7, 2 ],
  [ 5, 3 ] ]
您可以看到,在数组中的前5个值(即3个唯一值)之后,推送被中断

我不知道怎么做,我也不知道是用一段时间还是用一个for循环来做更好


有什么想法吗?

这实现了真正的推送:

var yourarray={
   arr:[],
   push:function(obj){
     for(a=0;a<this.obj.length){
     let count=0;
       for(i=0;i<this.arr.length;i++){
          if(obj[a]!=this.arr[i][a]){
             count++;
             if(count==3){
                break;
             }
          }
        }
      }
     this.arr.push(obj);      
    };
 };
然后像这样访问它:

alert(yourarray.arr);

但是,直接访问数组已经不可能了

您可以使用一个对象将每个第一个数字存储为属性,并检查
的每次迭代,同时
循环该对象中的任何值是否等于3。如果是,你可以打破循环。我用随机数作为第一个数字

var-ar=[];
var obj={}
while(true){
var firstNum=parseInt(Math.random()*5)+1;
ar.push([firstNum,1]);
obj[firstNum]=(obj[firstNum]| | 0)+1;
var stop=Object.keys(obj).find(函数(e){
返回obj[e]==3;
});
如果(停止)中断;
}
控制台日志(obj);

控制台日志(ar)您可以实现一个函数,该函数将第一列的编号存储为对象中的属性,并在该对象中不存在该编号时递增计数器。如果计数器等于3,则有3个唯一元素,然后停止数组推送并中断循环

下面是一个示例代码

var arr =   ['-15, 1',
'-15, 2' ,
'2,3' ,
'2, 4' ,
'2, 5',
'77, 6','22,3'  ];

function unique(array) {
var arr = [],x,y,obj = {},count = 0,arr1;
for (i = 0; i < array.length ; i++) {
    arr1 = array[i].split(',');
    x = arr1[0] * 1;
    y = arr1[1] * 1;

    if (count === 3) {
        break;
    }

    array.push([x,y]);


    if (!obj[x]) {
        obj[x] = 1;
        count++;
    }

}
}
var arr=['-15,1',,
'-15, 2' ,
'2,3' ,
'2, 4' ,
'2, 5',
'77, 6','22,3'  ];
函数唯一(数组){
var arr=[],x,y,obj={},count=0,arr1;
对于(i=0;i
在填充2D数组的循环中,将数组发送到检查函数,该函数确定是否有3个唯一元素作为单个数组中的第一个元素存在。下面是check函数的代码,如果3个唯一元素还不存在,它将返回true,一旦找到3个唯一元素,它将返回false

var a = []; //; 
var i = 0;
while (check(a)) {
  a[i]=[];
  a[i].push(RandomNumber(1, 42));
  a[i].push(i + 1);
  i++;
}

function RandomNumber(min, max) {
  return Math.floor(Math.random() * (max - min + 1) + min);
}

function check(arr) {
  var length = arr.length;
  var tmp = [];
  for (var j = 0; j < length; j++) {
    if (tmp.indexOf(arr[j][0]) === -1) {
      tmp.push(arr[j][0]);
    }
    if (tmp.length === 3) {
      return false;
    }
  }
  return true;
}
console.log('test: ', a);
console.log('check: ', check(a));
var a=[];/;
var i=0;
while(勾选(a)){
a[i]=[];
a[i].push(随机数(1,42));
a[i]。推(i+1);
i++;
}
函数随机数(最小值、最大值){
返回Math.floor(Math.random()*(max-min+1)+min);
}
功能检查(arr){
变量长度=arr.length;
var tmp=[];
对于(var j=0;j
对于(…){if(已经处于唯一项限制){don't push}}
,基本上。呵呵,我不知道如何检查这个奇怪的条件,所以写一些代码来计算数组中有多少项X,如果超过了限制,就不要推。创建一个对象,其键是您想要唯一的值。推送值时,还要将其添加到对象中。然后获取
Object.keys(您的对象)
的长度,以了解有多少个唯一值。当你达到极限时,打破循环。在ES6中,你可以使用一个集合,这可能会稍微方便一些。呃,这里有一些问题:1。
arr
属性是一个对象,
obj
参数是一个数组。2.此代码还抛出一个
SyntaxError
和3。我不认为即使它不在那里它也能工作,因为它试图读取a)不存在的
arr.length
,我想你的意思是
this.arr
b)即使它是一个对象,所以它也没有
length
属性。编辑:哦,我不知怎么忘了4。糟糕的格式。@vlaz:对不起。EditedI更新第一个问题。这样,我只需要在支票是假的情况下才需要!但是我需要加入一个循环,我试图在一个简单的代码上实现这个解决方案,也许我错过了下一个包含codevar a=newarray(4);//例如5;对于(var i=0;ivar a = []; //; var i = 0; while (check(a)) { a[i]=[]; a[i].push(RandomNumber(1, 42)); a[i].push(i + 1); i++; } function RandomNumber(min, max) { return Math.floor(Math.random() * (max - min + 1) + min); } function check(arr) { var length = arr.length; var tmp = []; for (var j = 0; j < length; j++) { if (tmp.indexOf(arr[j][0]) === -1) { tmp.push(arr[j][0]); } if (tmp.length === 3) { return false; } } return true; } console.log('test: ', a); console.log('check: ', check(a));