Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Вопрос по массиву (https://javascript.ru/forum/dom-window/52794-vopros-po-massivu.html)

igorz 07.01.2015 13:40

Вопрос по массиву
 
Здравствуйте, (не в том разделе тему создал :( )
Вот какой вопросик появился:
Допустим, у меня есть выборка из бд, которая возвращает мне двумерный массив вида:
var mas = [
["1", "Mike"],
["1", "Mike"],
["2", "John"],
["3", "Bob"],
["1", "Mike"],
["3", "Jim"]
];


Далее, моя задача взять этот массив, и отсортировать его в другой массив по первым цифрам. Я могу это сделать, если я знаю что у меня там всего 3 разных цифры - т.е. 1,2 и 3. Я создаю массив на 3 элемента и начинаю сортировку. Всё нормально - всё срабатывает. Имею в итоге такое:
result = [
[["1", "Mike"], ["1", "Mike"], ["1", "Mike"]], 
[["2", "John"]], 
[["3", "Bob"],["3", "Jim"]]
];


Но вот я не понимаю - как мне быть, если я не буду знать заранее сколько разных цифр мне там прийдёт, и как тогда работать с массивом result заранее не зная его размера :-?
Что-нибудь по типу "динамического" массива ? Но его вроде в js нет. Как можно поступить в данной ситуации ?

Safort 07.01.2015 13:54

Вообще-то в JS и есть динамические массивы)

Safort 07.01.2015 14:04

Что мне подсказывает, что так хранить данные - это не круто. Может, тебе лучше хранить в виде свойств объектов?

var result = {
  Mike: { num: '1', length: 3 },
  John: { num: '2', length: 1 },
  Bob:  { num: '3', length: 1 },
  Jim:  { num: '3', length: 1 }
}

alert(result.Mike.num);
alert(result.Mike.length);

danik.js 07.01.2015 14:07

Вобще херня какая-то. Надеюсь эта дикая фигня используется не в публичном сайте, а где нибудь без палева, для себя?
var data = [
    ["1", "Mike"],
    ["1", "Mike"],
    ["2", "John"],
    ["3", "Bob"],
    ["1", "Mike"],
    ["3", "Jim"]
];

var result = data.reduce(function(result, element) {
    var key = element[0];
    result[key] = result[key] || [];
    result[key].push(element);
    return result;
}, []);
console.log(result);

igorz 07.01.2015 15:06

Цитата:

Сообщение от danik.js (Сообщение 350077)
Вобще херня какая-то. Надеюсь эта дикая фигня используется не в публичном сайте, а где нибудь без палева, для себя?

Я не спец в js чтоб спорить, но всё же...
Да, для себя, но в чём фигня-то? На сервере отрабатывает php sql запрос, и возвращает мне
$rows = array();
while ($data = mysql_fetch_array($qr_result)) { $rows[] = ... }
print json_encode($rows);

Ответ приходит в ajax
...
success: function (response) {
            mas = JSON.parse(response);
}

В итоге имею тот массив, за который написал в начале.
Потом мне этот массив надо перелопать для того, чтобы построить из него график, используя c3.js либу. Т.е. каждый подмассив это будет отдельная линия, и для каждой я планирую вызывать функцию вроде такой:
// var x1 = ["x1", "1", "2", "3"];
// var data1 = ["data1", "1", "2", "3"];
function draw_graph() {
  chart.load({
    xs: {
      data1 : x1[0], //привязка data1 к х1
    },
    columns: [
      x1,
      data1,
    ],
  });
}

igorz 07.01.2015 15:37

Не судите меня строго за мой индийский код, попробую ещё раз описать :)

Выше описал то, как я получаю массив. Лишние столбцы поубирал, оставил 2 для наглядности.
var data = [
    ["Name","1"],
    ["Name","2"],
    ["Name","1"],
    ["Name","2"],
    ["Name","1"],
    ["Name","2"],
    ["Name","1"],
    ["Name","2"],
    ["Name","1"],
    ["Name","2"]];

Далее, я, теоретически, знаю что у меня во втором столбце только 2 разных значения, и я продолжаю писать индийский код:
var values = ["1","2"];
var sortedArray = [[],[]];

for (var i = 0; i < data.length; i++) {
      for (var j = 0; j < values.length; j++) {
        if (data[i][1] == values[j]) {
          sortedArray [j][sortedArray[j].length] = data[i];
        }
      }
    }

//смотрю результат
    for (var i = 0; i < sortedArray.length; i++) {
      console.log("i = " + i + ", " + sortedArray[i]);
      console.log();
    }

//i = 0, Name,1,Name,1,Name,1,Name,1,Name,1
//i = 1, Name,2,Name,2,Name,2,Name,2,Name,2

А вот если на N элементов - то как быть с созданием массива, вот этого не знаю.
Я могу, конечно, сделать доп sql запрос, который мне вернёт кол-во этих уникальных values - но может можно как-то без него :)

Rise 07.01.2015 16:10

igorz, так ты изначально формируй sql-запрос и обрабатывай его правильно, а не как попало.

igorz 07.01.2015 16:27

Цитата:

Сообщение от Rise (Сообщение 350107)
igorz, так ты изначально формируй sql-запрос и обрабатывай его правильно, а не как попало.

"Выстрел в небо".

sql-запрос у меня сформирован так, как оно того требует:
$sql = "SELECT player.name, monitor.cord, monitor.planet_activity, monitor.moon_activity, monitor.data_activity 
                FROM monitor, player 
                WHERE player.id = monitor.player_id
                AND player.name = '$playerName' 
                AND (STR_TO_DATE(monitor.data_activity, '%d.%m.%Y') BETWEEN '$start' AND '$finish')
                ORDER BY monitor.data_activity ASC";

И дальше как раз и пытаюсь его "обработать", разделив по отдельным массивам результаты по "monitor.cord". Он может быть различным в результате запроса.

Aetae 07.01.2015 16:32

var data = [
    ["Name","1"],
    ["Name","2"],
    ["Name","1"],
    ["Name","2"],
    ["Name","1"],
    ["Name","2"],
    ["Name","1"],
    ["Name","2"],
    ["Name","1"],
    ["Name","2"]
];

var sortedArray = [];
for (var i = 0; i < data.length; i++) {
    
    var index = data[i][1] - 1;
    if (!sortedArray[index]){
        sortedArray[index] = [];
    }
    sortedArray[index].push(data[i]);
}

console.log(sortedArray)

Только, как намекнули выше, с сервера стоит получать уже в нужном виде, и не городить лишнего.
igorz, может вместо order by использовать group by, нэ?

Rise 07.01.2015 17:00

Цитата:

И дальше как раз и пытаюсь его "обработать", разделив по отдельным массивам результаты по "monitor.cord".
так ты пытайся на сервере а не на клиенте, на клиент отправляй уже приготовленный как надо массив.


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