Javascript在出现唯一值时停止推送
我用while循环填充二维数组,但是当第一列包含3个不同的唯一值时,我需要停止推送 开始是这样的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)
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));