Javascript在发生唯一值时停止推送

时间:2016-09-26 18:25:45

标签: 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)
{
    // 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个唯一值

我不知道该怎么做,而且我不知道用一段时间还是用于循环是否更好。

任何想法?

4 个答案:

答案 0 :(得分:1)

在填充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));

答案 1 :(得分:0)

这实现了真正的推动:

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);      
    };
 };

现在你可以做到:

yourarray.push([0,1,2]);

并访问它:

alert(yourarray.arr);

然而,直接访问yourar是不可能的

答案 2 :(得分:0)

您可以使用一个对象将每个第一个数字存储为属性,并在while循环的每个迭代中检查该对象中的任何值是否等于3.如果是,则可以从循环中断开。我使用随机数作为第一个数字。

&#13;
&#13;
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(function(e) {
    return obj[e] == 3;
  });
  if (stop) break;
}

console.log(obj);
console.log(ar);
&#13;
&#13;
&#13;

答案 3 :(得分:0)

您可以实现一个函数,该函数将第一列的编号存储为对象中的属性,如果该对象中不存在该编号,则递增计数器。如果计数器等于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++;
    }

}
}