Javascript сортировка двухмерного массива со строками и int - PullRequest
0 голосов
/ 24 мая 2018

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Results</title>
</head>
<body>
  <div>
    <table width="80%" border="0" align="center">
      <tr>
        <td width="40%" colspan="4" align="center">
	    <div style="overflow: scroll; height: 400px; width: 80%; border: 1px dotted black; background-color: #DAAD1F;">
<script>
localStorage.setItem('1526200226958', [1, 'completed', '00:01:06:32', 'Mario,3.png,']);
localStorage.setItem('1526205223958', [1, 'completed', '00:04:03:14', 'Toad,2.png,']);
localStorage.setItem('1526201223958', [2, 'notCompleted', '00:08:09:37', 'Princess,5.png,']);
localStorage.setItem('1526220323958', [12, 'notCompleted', '00:06:01:59', 'Luigi,4.png,']);
localStorage.setItem('1526300323958', [7, 'notCompleted', '00:04:34:37', 'Luigi,4.png,']);
localStorage.setItem('1526600323958', [3, 'notCompleted', '00:13:53:04', 'Luigi,4.png,']);
localStorage.setItem('1526000253958', [1, 'notCompleted', '00:04:02:20', 'Yoshi,1.png,']);
var test = new Array();
var i = 0;
var pegsLeft;
var gameDone = "";
for (var key in localStorage) {
    if (key != 'key' && key != 'setItem' && key != 'getItem' && key != 'removeItem' && key != 'clear' && key != 'length' && key != 'board') {
        test[i] = localStorage.getItem(key).split(',');
        i++;
    }
}
test.sort(mySortingA);

function mySortingA(a, b) {
    a = a[1] + a[0] + a[2];
    b = b[1] + b[0] + b[2];
    return a == b ? 0 : (a < b ? -1 : 1)
}

document.write("<table width='80%' border='0' align='center' style='border-collapse:collapse;'>");
for (i = 0; i < test.length; i++) {
    if (test[i][1] == 1) {
        pegsLeft = " peg"
    } else {
        pegsLeft = " pegs"
    };
    if (test[i][1] == "completed") {
        gameDone = "game completed"
    } else {
        gameDone = " "
    };
    document.write("  <tr"); if (ranking == i) { document.write(" bgcolor='#FFCC00'><a name='actPos'></a>") } else { document.write(">") };
    document.write("    <td width='30'>" + (i + 1) + ".</td>");
    document.write("    <td width='30'>Image: " + test[i][4] + "</td>");
    document.write("    <td>" + test[i][3] + test[i][5] + "</td>");
    document.write("    <td width='15%'>" + test[i][0] + pegsLeft + " left</td>");
    document.write("    <td width='15%'>" + gameDone + "</td>");
    document.write("    <td width='15%'>" + test[i][2] + "</td>");
    document.write("  </tr>");
}
document.write("</table>");
      </script></div></td>
      </tr>
    </table>
  </div>
</body>
</html>

У меня есть следующие данные в localStorage:

localStorage.setItem ('1526200226958', [1, 'complete', '00: 01:06:32 ',' Mario, 3.png, ']);localStorage.setItem ('1526205223958', [1, 'complete', '00: 04: 03: 14 ',' Toad, 2.png, ']);localStorage.setItem ('1526201223958', [2, 'notCompleted', '00: 08: 09: 37 ',' Princess, 5.png, ']);localStorage.setItem ('1526220323958', [12, 'notCompleted', '00: 06: 01: 59 ',' Luigi, 4.png, ']);localStorage.setItem ('1526300323958', [7, 'notCompleted', '00: 04: 34: 37 ',' Luigi, 4.png, ']);localStorage.setItem ('1526600323958', [3, 'notCompleted', '00: 13: 53: 04 ',' Luigi, 4.png, ']);localStorage.setItem ('1526000253958', [1, 'notCompleted', '00: 04: 02: 20 ',' Yoshi, 1.png, ']);

Я помещаю эти данные в двухмерноемассив:

for (var key in localStorage) {
   if (key != 'key' && key != 'setItem' && key != 'getItem' && key != 'removeItem' && key != 'clear' && key != 'length' && key != 'board') {
        test[i] = localStorage.getItem(key).split(',');
        i++;
    }
}

Затем я пытаюсь отсортировать их с помощью следующей функции (сначала всех, кто завершил игру, затем по первым значениям 2-го массива и последним по времени):

function mySortingA(a, b) {
a = a[1] + a[0] + a[2];
b = b[1] + b[0] + b[2];
return a == b ? 0 : (a < b ? -1 : 1)

}

Но запись: localStorage.setItem ('1526220323958', [12, notCompleted ', '00: 06: 01: 59', 'Luigi, 4.png,']);обрабатывается неправильно, кажется, что он рассматривается как строка, а не как целое число.Я пытался разобрать первое значение из 2-х массивов, как это:

a = a[1] + parseInt(a[0]) + a[2];
b = b[1] + parseInt(b[0]) + b[2];

Но это не работает.Может кто-нибудь сказать мне, как я должен это сделать?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Если вы объедините строки и целые числа, результатом будет строка.Не имеет значения, что вы выполнили parseInt для числа в середине строки.

Когда вы создадите свою собственную функцию сортировки, вы получите 1, 0 или -1 в результате.Сначала сравните, что вы хотите в качестве основного значения.Если результат этого первого теста равен нулю, тогда у вас есть ничья.В этих случаях вы должны сравнить второе значение и вернуть 1 или -1 в качестве результата функции.

0 голосов
/ 24 мая 2018

В настоящее время вы объединяете число со строкой, и поэтому весь массив сортируется по строковому значению.Вам необходимо проверить каждое значение отдельно, например:

var test = [
  [1, 'completed', '00:01:06:32', 'Mario,3.png,'],
  [12, 'notCompleted', '00:10:01:59', 'Luigi,4.png,'],
  [1, 'completed', '00:04:03:14', 'Toad,2.png,'],
  [2, 'notCompleted', '00:08:09:37', 'Princess,5.png,'],
  [12, 'notCompleted', '00:06:01:59', 'Luigi,4.png,'],
  [24, 'completed', '00:04:34:37', 'Luigi,4.png,'],
  [3, 'notCompleted', '00:13:53:04', 'Luigi,4.png,'],
  [1, 'notCompleted', '00:04:02:20', 'Yoshi,1.png,'],
  [12, 'notCompleted', '00:01:01:59', 'Luigi,4.png,'],
  [2, 'completed', '00:04:34:37', 'Luigi,4.png,'],
];

test.sort((a, b) => {
  // Sort by the second value
  if (a[1] < b[1]) {
    return -1;
  }

  if (a[1] > b[1]) {
    return 1;
  }

  // If second value is equal - sort by the first value of the array
  if (a[0] < b[0]) {
    return -1
  }

  if (a[0] > b[0]) {
    return 1;
  }

  // If first value is equal - sort by the third value of the array
  if (a[2] < b[2]) {
    return -1;
  }

  if (a[2] > b[2]) {
    return 1;
  }

  // All are equal
  return 0;
});

console.log(test);
0 голосов
/ 24 мая 2018

Вы можете взять индексы и результат сравнения для каждого элемента одного индекса.Это работает для чисел и строк.

var array = [[1, 'completed', '00:01:06:32', 'Mario,3.png,'], [12, 'notCompleted', '00:10:01:59', 'Luigi,4.png,'], [1, 'completed', '00:04:03:14', 'Toad,2.png,'], [2, 'notCompleted', '00:08:09:37', 'Princess,5.png,'], [12, 'notCompleted', '00:06:01:59', 'Luigi,4.png,'], [24, 'completed', '00:04:34:37', 'Luigi,4.png,'], [3, 'notCompleted', '00:13:53:04', 'Luigi,4.png,'], [1, 'notCompleted', '00:04:02:20', 'Yoshi,1.png,'], [12, 'notCompleted', '00:01:01:59', 'Luigi,4.png,'], [2, 'completed', '00:04:34:37', 'Luigi,4.png,']];

array.sort(function (a, b) {
    var d;
    [1, 0, 2].some(i => d = a[i] > b[i] || -(a[i] < b[i]));
    return d;
});

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...