Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Массив и увеличение значения Элемента массива (https://javascript.ru/forum/misc/71385-massiv-i-uvelichenie-znacheniya-ehlementa-massiva.html)

Romzes 14.11.2017 20:16

Массив и увеличение значения Элемента массива
 
Доброго времени суток всем ГУРУ!
Я новичок в javascript! Пишу программку и столкнулся с такой проблемой:

при выполнении условия (в массиве refferee[j][i] есть совпадение значения например '1') нужно значение второго массива увеличить на один.

Вопрос: такая конструкция рабочая r[j][i]++; ???

вот листинг:

for (var j=0; j<sumparticipant; j++)
{
	
		for (var i=0; i<sumrefferee; i++)
		{
   			switch (refferee[j][i]) 
							{
							case 1: r[j][i]++;
							case 1: case 2: r[j][i]++;
							case 1: case 2: case 3: r[j][i]++;
							case 1: case 2: case 3: case 4: r[j][i]++; 
							case 1: case 2: case 3: case 4: case 5: r[j][i]++; 
							case 1: case 2: case 3: case 4: case 5: case 6: r[j][i]++;
							}
	 
	   	
            }	
}



sumparticipant - число заданное заранее;
sumrefferee - число заданное заранее;
refferee[j][i] - массив чисел полученный опросом полей input по getElementsByName (проверял внутри есть данные);
r[j][i] - массив счетчик, который должен посчитать количество чисел в массиве refferee[j][i].

Голова пухнет, по моему я застрял именно на счетчике. Прошу опытных пользователей о помощи!

Заранее спс!

рони 14.11.2017 20:37

:-? ничего не понимаю

Lion777 14.11.2017 21:01

Цитата:

Вопрос: такая конструкция рабочая r[j][i]++; ???
смотря для чего, таким образом ты перезапишешь значение в массиве на +1.

Romzes 14.11.2017 21:17

да, но почему то там остается 0 ане 1

Romzes 14.11.2017 21:20

В целом задача: мне нужно посчитать сколько в строке refferee[1][i] значений 1, потом 1или2, потом 1 или2или3 и т.д.

Но походу моих знаний JS не хватает чтоб построить код (((

Lion777 14.11.2017 21:37

мне не совсем понятно что тебе нужно )), покажи пример строк и что надо с ними сделать, а так тяжело понять, ты явно что-то не то делаешь...

Romzes 14.11.2017 21:56

Вложений: 1



Столбцы a,b,c,d,e - входящие данные, согласно строк 11,21,31..61 выставляются цыфры от 1 до 6 (6 - количество строк, может быть и 8, и более, тогда будет выставляться до 8 или более)

В столбцы 1,1-2,1-3..1-6 нужно посчитать согласно строки сколько цыфр 1,1ил2, 1или2или3... .

по сути это определения результатов выступления:
Строки количество желающих выступить (в примере 6, поэтому 6 мест),
Столбцы с судьями (a,b,c,d,e) и они тоже могут быть 5, могут более или менее, которые выставляют балы (от 1 до 6-или сколько участников).

В примере показано как должно быть посчитано.


Для 6 строк и 5 судей статически я написал громоздкий код. Теперь надо привести код так, чтоб я не зависил от количества выступающих (а вдруг их 40 или 100) и количества судей.

Romzes 14.11.2017 22:09

case - тоже на ограниченное количество выступлений - 6. пока не знаю как на неограниченное поставить

рони 14.11.2017 22:28

Romzes,
а зачем считать столько 1 и т.д. может сразу сумму баллов?

Romzes 14.11.2017 22:31

так определено правилами, арифметически не определить.
По сути это не балы, а места. тоесть судья выставляет места. программа должна посчитать кому судьи больше отдали первых, вторых и .т.д. мест. поэтому нужно количество первы, первы ивторых мест, первых и вторых и третих месть и т.д. короче правила дебильные, но по ним надо получить результат

рони 14.11.2017 22:43

Romzes,
таблица как формируется?

Lion777 15.11.2017 02:37

вот пример
//данные с оценками от судей
a = 
[
[1,5,1,1,2],
[2,2,5,4,1],
[3,3,3,2,3],
[4,4,2,3,4],
[5,1,4,5,5],
[6,6,6,6,6]
];

//создаем массив для оценок, заполняем нулями
var b = a.map(()=>[]);
for (var i=0; i<a.length; i++){
    for (var j=0; j<6; j++) b[i][j] = 0;
}

//тут считаем сколько каких оценок, b[0][0] - 1, b[0][1] - 2 и т.д.
for (var i = 0; i < a.length; i++){
	for (var j = 0; j < a[i].length; j++){
		switch(a[i][j]){
			case 1: b[i][0]++;
			break;
            case 2: b[i][1]++;
			break;
            case 3: b[i][2]++;
			break;
            case 4: b[i][3]++;
			break;
            case 5: b[i][4]++;
			break;
            case 6: b[i][5]++;
			break;
        }	
	}
}

alert(`${b[0]}\n${b[1]}\n${b[2]}\nи т.д.`);

в массиве b посчитанно сколько каких оценок, а дальше просто суммируешь

рони 15.11.2017 09:57

Lion777,
а место итоговое как вычислить?

Lion777 15.11.2017 12:35

если бы автор описал как вычисляется ))), то, возможно, бы и вычислил в этой странной системе оценок ))...

Dilettante_Pro 15.11.2017 12:55

Lion777,
а зачем switch...case?
//данные с оценками от судей
a = 
[
[1,5,1,1,2],
[2,2,5,4,1],
[3,3,3,2,3],
[4,4,2,3,4],
[5,1,4,5,5],
[6,6,6,6,6]
];

//создаем массив для оценок, заполняем нулями
var b = a.map(()=>[]);
for (var i=0; i<a.length; i++){
    for (var j=0; j<6; j++) b[i][j] = 0;
}

//тут считаем сколько каких оценок, b[0][0] - 1, b[0][1] - 2 и т.д.
for (var i = 0; i < a.length; i++){
	for (var j = 0; j < a[i].length; j++){
			 b[i][a[i][j] - 1]++;
	}
}

alert(`${b[0]}\n${b[1]}\n${b[2]}\nи т.д.`);

Lion777 15.11.2017 13:30

баг в версии 1.00 ))

рони 15.11.2017 13:50

Цитата:

Сообщение от Lion777
если бы автор описал как вычисляется ))),

Цитата:

Сообщение от Romzes
программа должна посчитать кому судьи больше отдали первых, вторых и .т.д. мест.

у кого больше первых мест, у того и первое место :) если одинаково первых сравниваются "веса" за вторые места т.д.

Lion777,
Dilettante_Pro,
Цитата:

Сообщение от Romzes
Теперь надо привести код так, чтоб я не зависил от количества выступающих (а вдруг их 40 или 100) и количества судей.



формула должна быть универсальной для любого количества участников и судей.


ТС куда-то пропал ...

Romzes 15.11.2017 14:02

Пошел другим путем, отсортировал значения массива первой строки, посчитал повторы, и потом суммировал предыдущую ячейку массива с текущей.

Romzes 15.11.2017 14:06

Цитата:

Сообщение от рони (Сообщение 470151)
у кого больше первых мест, у того и первое место :) если одинаково первых сравниваются "веса" за вторые места т.д.

Совершенно верно, подсчет идет именно так, но сейчас первая стадия посчитать количество мест. потом исходя и пойдет место в турнире но если совпадение - там 10 часных правил для продолжения

Romzes 15.11.2017 14:12

Вот что у меня получилось, правда только для одного участника. сейчас буду доделывать для много участников

var sumparticipant=6; //количество участников
			var	sumrefferee=5;    //количество судей
				
				
			
		var reffereeGet = document.getElementsByName('refferee');
		
		var refferee=new Array();
		    	
		
// Присваеваем все input в массив refferee[j][i]

metka1:
for (var j=0; j<sumparticipant; j++)
{
	refferee[j]=new Array();
		for (var i=0; i<sumrefferee; i++)
		{
			
			
			
			refferee[j][i]=reffereeGet[i].value;
			
			 
		   if (typeof refferee[j][i] == 'undefined' || refferee[j][i] == null || refferee[j][i] == 0) 
		   {
			   var arb=i+1;
		   alert ('Судья '+arb+' не определил место'); break metka1;
		   }
			
		
		}
}


// сортируем масив 1,2,3,4,5 и.т.д.			

function compareNumeric(a, b) {
  if (a > b) return 1;
  if (a < b) return -1;
}

refferee[0].sort(compareNumeric);



//считаем количество повторов
var result = {};

for (var i = 0; i < sumrefferee; ++i)
{
    var a = refferee[0][i];
    if (result[a] != undefined)
        ++result[a];
    else
        result[a] = 1;
}

var result1 = {};
// выводим результат в масив result1[i]
  for (var key in result)
  	{	
	for (var i=1; i<sumparticipant+1; i++)
		{
		   
		   if (i==key)
		   {
		   
		   		   result1[i]=result[key];
		   		   
		   }
		   
		}
			
	}


// заменяем пустые значения на 0
	
	for (var i=1; i<sumparticipant+1; i++)
		{
		   
		   if (typeof result1[i] == 'undefined' && result1[i] == null) 
		   {
			result1[i]=0;   
		   }
		}
	
// суммируем предедущее значение с настоящим 2+1
for (var i=2; i<sumparticipant+1; i++)
		{
		   
		   	   
		   	result1[i]=result1[i-1]+result1[i];
		   		   
		  
		   
		}	
	
//выводим результаты	
for (var i=1; i<sumparticipant+1; i++)
		{
		document.getElementsByName('r')[i-1].value=result1[i];
	
		}



Код конечно громоздкий, но я новичек, простите если что :( :)

рони 15.11.2017 14:17

Цитата:

Сообщение от Romzes
там 10 часных правил для продолжения

каких если можно коротко?

Lion777 15.11.2017 14:29

данный код уже универсален, там достаточно только указать исходные данные, он без case автоматический, осталось только остальные подсчеты сделать

Romzes 15.11.2017 14:56

Цитата:

Сообщение от Lion777 (Сообщение 470161)
данный код уже универсален, там достаточно только указать исходные данные, он без case автоматический, осталось только остальные подсчеты сделать

к этому стремился

Romzes 15.11.2017 14:58

Цитата:

Сообщение от рони (Сообщение 470158)
каких если можно коротко?

1 место - тот у кого больше 1х мест, если одинаково то ток у кого 1-2 мест больше и т.д.

2 место - ток у кого больше 1-2 мест, если одинаково то ток у кого больше 1х мест и по такому подобию


называется Скейтинг

Romzes 15.11.2017 15:03

У меня опять стопор
var reffereeGet = document.getElementsByName('refferee');      var z=0;    	
metka1:
for (var j=0; j<sumparticipant; j++)
{
	refferee[j]=new Array();
		for (var i=0; i<sumrefferee; i++)
		{
		refferee[j][i]=reffereeGet[z].value; 
		z++;
					 
		   if (typeof refferee[j][i] == 'undefined' || refferee[j][i] == null || refferee[j][i] == 0) 
		   {
		     var arb=i+1;
		   alert ('Судья '+arb+' не определил место'); break metka1;
		   }
	 }
}

document.write('1 - '+ refferee[0][0] + '<br>2 - '+ refferee[0][1] + '<br>3 - '+ refferee[0][2] + '<br>4 - '+ refferee[0][3] + '<br>5 - '+ refferee[0][4]+
'<br><br>6 - '+ refferee[1][0] + '<br>7 - '+ refferee[1][1] + '<br>8 - '+ refferee[1][2] + '<br>9 - '+ refferee[1][3] + '<br>10 - '+ refferee[1][4]);




Почему в строке 8 я не могу использовать переменную z в выражении
"reffereeGet[z].value" ???

Если я ставлю i - то работает, если z - не работает. Хотя переменная z++ считается до 30 (согласно циклу) ,выводится значение


А нужно это чтоб разделить одномерный массив полученный путем опроса input (var reffereeGet = document.getElementsByName('refferee'); ) на двухмерный, то есть построчно

Lion777 15.11.2017 15:18

Цитата:

Сообщение от Romzes (Сообщение 470168)
к этому стремился

Я имел ввиду тот, что я писал и подправил другой участник ))

Romzes 15.11.2017 15:23

Цитата:

Сообщение от Lion777 (Сообщение 470175)
Я имел ввиду тот, что я писал и подправил другой участник ))

я к сожалению сначала написал, а потом увидел Ваше предложение, и к сожалению я его до конца не понял, так как мало владею JS

Не понятно выражение var b = a.map(()=>[]);

рони 15.11.2017 15:37

Romzes,
без комментариев ... ввести места в инпуты(1...6), получить результат
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  .total tr td:last-child {
    color: #FF0000;
    font-size: 28px
  }
  td {
    height: 22px; width: 80px; text-align: center;
    font-weight: bold;

  }

  </style>


</head>

<body>

<div class="refferee"></div>
<div class="total"></div>
<script>
function fn(f) {
    var c = f.map(function(a, g) {
        for (var d = [], b = 1, e = f.length; b <= e; b++) {
            var c = a.filter(function(a) {
                return a == b
            }).length;
            d.push(c)
        }
        return d
    });
    c.slice(0).sort(function(a, c) {
        for (var d, b = 0, e = a.length; b < e; b++)
            if (d = c[b] - a[b]) return d;
        return 0
    }).forEach(function(a, c) {
        a.push(++c)
    });
    return c
}

function createTable(row, col, parent, mas) {
    var table = document.createElement("table"),
        arr = [];
    var f = function(a, b, c) {
        return function() {
            arr[a][b] = +c.value || 0;
            var res = fn(arr);
            out(res)
        }
    };
    for (var i = 0; i < row; i++) {
        var tr = table.insertRow(i);
        arr[i] = [];
        for (var j = 0; j < col; j++) {
            var td = tr.insertCell(j);
            if (mas) td.textContent = mas[i][j];
            else {
                arr[i][j] = 0;
                var input = document.createElement("input");
                input.addEventListener("input", f(i, j, input));
                td.appendChild(input)
            }
        }
    }
    parent.appendChild(table);
    return arr
}

function out(arr) {
    total.innerHTML = "";
    createTable(arr.length, arr[0].length, total, arr)
}
var total = document.querySelector(".total");
var refferee = document.querySelector(".refferee");
var mas = createTable(6, 5, refferee);
var res = fn(mas);
out(res);
  </script>
</body>
</html>

Lion777 15.11.2017 15:38

Ну об этом стоит почитать, метод map объекта Array и стрелочные функции

Romzes 15.11.2017 15:45

Цитата:

Сообщение от рони
Romzes,
без комментариев ...

Я понял. :)

за код спасибо. буду разбираться. Правда чуть не то 1 - столбец количество 1х мест, 2 столбец - количество ПЕРВЫХ И ВТОРЫХ мест и т.д.
Короче система неординарная и сложная. поскольку я новичок, сложно разобраться в Вашем коде, но я непременно постараюсь.

Romzes 15.11.2017 15:46

Цитата:

Сообщение от Lion777 (Сообщение 470180)
Ну об этом стоит почитать, метод map объекта Array и стрелочные функции

Спасибо Вам, сейчас займусь

рони 15.11.2017 15:47

Цитата:

Сообщение от Romzes
Правда чуть не то 1 - столбец количество 1х мест, 2 столбец - количество ПЕРВЫХ И ВТОРЫХ мест и т.д.

там так и есть

Lion777 15.11.2017 15:50

рони крутой ))

Romzes 15.11.2017 15:51

Цитата:

Сообщение от рони (Сообщение 470184)
там так и есть

На сколько я понял я в инпут ввожу оценки а внизу получаю расчет:

так вот если я ввожу : 1,2,3,4,5

то подсчет выглядет у Вас 1,1,1,1,1
а должен: 1,2,3,4,5.

У вас 1,1,1,1,1

Romzes 15.11.2017 15:52

Цитата:

Сообщение от Lion777 (Сообщение 470188)
рони крутой ))

Согласен +100\500 %))))

Romzes 15.11.2017 15:57

Ронни, все равно спасибо за помощь. Я вижу к чему стремится, надо новые функции разбирать ))) Я все равно к сожалению не смогу использовать ваш код, так как я должен сам написать и разбираться. Сейчас у меня что то получается, правда код громоздкий, возможно неудобный. Я сторонник что б не за меня сделали, а сам.


Подскажите форумчане, может кто знает как просто разбить одномерный массив в двумерный. что то гуглю и не один пример не пойму ((

рони 15.11.2017 16:07

Цитата:

Сообщение от Romzes
то подсчет выглядет у Вас 1,1,1,1,1
а должен: 1,2,3,4,5.

:blink:

не осилил , что не так ? откуда 1,2,3,4,5 взялось в весах

Romzes 15.11.2017 16:30

Вложений: 1
Цитата:

Сообщение от рони (Сообщение 470194)
:blink:

не осилил , что не так ? откуда 1,2,3,4,5 взялось в весах

Наглядней понятней будет :) Ниже подготовил картинку. но это самое простое, дальше отдельные правила если совпадут места ((

рони 15.11.2017 17:12

Romzes,
ок ... давайте посмотрим результат колонка место - вдруг будет совпадение?

мой алгоритм 1, 2, 4, 5, 3, 6 а ваш?

рони 15.11.2017 17:56

Romzes,
если очень хочется, добавил плюс в 3-4 строку, будет вам 1245
заменить в коде функцию пост № 28
function fn(f) {
    var c = f.map(function(a, g) {
        for (var d = [], b = 1, e = f.length, c = 0; b <= e; b++) {
             c += a.filter(function(a) {
                return a == b
            }).length;
            d.push(c)
        }
        return d
    });
    c.slice(0).sort(function(a, c) {
        for (var d, b = 0, e = a.length; b < e; b++)
            if (d = c[b] - a[b]) return d;
        return 0
    }).forEach(function(a, c) {
        a.push(++c)
    });
    return c
}


Часовой пояс GMT +3, время: 08:00.