2016-09-26 2 views
-1

Я заполняю массив 2d циклом while, но мне нужно остановить нажатие, когда 1-й столбец содержит 3 разных уникальных значения.Javascript stop push при возникновении уникального значения

начало что-то вроде этого

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 ] ] 

Whell идеи о ожидаемом результате

arr: [ [ 4, 1 ], 
    [ 7, 2 ], 
    [ 5, 3 ] ] 

вы можете увидеть, что толчок прерван после первых 5, то есть 3 уникального значения в массиве

Я не знаю, как это сделать, и я не знаю, лучше ли с этим делать или цикл for.

Любая идея?

+2

'для (...) {if (уже при уникальном пределе предмета) {не нажимать}}', в основном. –

+0

Хехеэ Я не знаю, как проверить это странное состояние –

+0

, поэтому напишите какой-то код, чтобы подсчитать, сколько из элемента X у вас есть в массиве, и НЕ нажимайте, если он над ним. –

ответ

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

Однако доступ к yourarray непосредственно не по возможности больше

+0

Erm, некоторые проблемы здесь: 1. Свойством 'arr' является _an object_, а параметр' obj' - _an array_. 2. Этот код также выдает «SyntaxError» и 3. Я не уверен, что он будет работать, даже если его там нет, потому что он пытается прочитать 'arr.length', который не существует, я предполагаю, что вы имеете в виду' this .arr' b), даже тогда это _an object_, поэтому он не имеет свойства 'length'. EDIT: ой, и я как-то забыл 4. зверское форматирование. – vlaz

+0

@vlaz: извините. Отредактировано –

0

Вы можете использовать один объект для хранения каждого первого числа в качестве свойства и проверять каждую итерацию цикла 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);

0

Можно реализовать функцию, которая хранит номер первого столбца в качестве свойства в объекте, и увеличивает счетчик, если это число не существует в том, что object.If счетчик равный 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++; 
    } 

} 
} 
1

В цикле, где вы заполнение 2D массива, имеет массив отправленный на функцию проверки, которая определяет, если 3 уникальных элементы присутствуют в качестве первых элементов в индивидуальном массиве. Вот код для функции проверки, он возвращает true, если 3 уникальных элемента еще не присутствуют, как только он находит 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)); 
+0

Я обновляю 1-й вопрос. Таким образом, мне нужно только, если проверка неверна! Но мне нужно включить цикл while –

+0

Я попытался реализовать решение по простому коду, возможно, я пропустил что-то следующее, следующее в коде –

+0

var a = new Array (4); // Например, 5; для (var i = 0; i

Смежные вопросы