【问题标题】:Javascript stop push when unique value occur出现唯一值时 Javascript 停止推送
【发布时间】:2016-09-26 18:25:44
【问题描述】:

我使用 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个之后push被中断了,也就是数组中的第3个唯一值

我不知道怎么做,也不知道用 while 还是 for 循环更好。

有什么想法吗?

【问题讨论】:

  • for(...) { if (already at unique item limit) { don't push } } ,基本上。
  • 呵呵呵呵我不知道怎么检查这个奇怪的情况
  • 所以编写一些代码来计算数组中有多少项 X,如果超过限制就不要推送。
  • 创建一个对象,其键是您希望唯一的值。当你推送一个值时,也将它添加到对象中。然后获取Object.keys(yourObject) 的长度,找出有多少个唯一值。当你达到极限时,跳出循环。
  • 在 ES6 中可以使用 Set,可能会更方便一些。

标签: javascript arrays count 2d unique


【解决方案1】:

在填充 2D 数组的循环中,将数组发送到检查函数,以确定是否存在 3 个唯一元素作为单个数组中的第一个元素。这是检查函数的代码,如果 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));

【讨论】:

  • 我更新了第一个问题。这样我只需要支票是假的!但我需要放入一个while循环
  • 我试图在一个简单的代码上实现解决方案,也许我错过了下一个包含代码的东西
  • var a = new Array(4); // 例如 5; for (var i = 0; i
  • @Jorman Franzini,我已经修改了您在 cmets 部分中的代码。完整的工作代码在帖子中。
【解决方案2】:

您可以使用一个对象将每个第一个数字存储为属性,并检查 while 循环的每次迭代是否该对象中的任何值等于 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(function(e) {
    return obj[e] == 3;
  });
  if (stop) break;
}

console.log(obj);
console.log(ar);

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      这实现了真正的推送:

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

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

      【讨论】:

      • 呃,这里有些问题: 1. arr 属性是一个对象,obj 参数是一个数组。 2. 这段代码也抛出了SyntaxError 和 3. 我不认为即使它不存在它也会起作用,因为它试图读取arr.length 其中a) 不存在,我假设你的意思是this.arr b ) 即使那样它也是一个对象,所以它没有length 属性。编辑:哦,我不知何故忘记了 4. 糟糕的格式。
      • @vlaz:对不起。已编辑
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-25
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多