Вопрос по массиву
Здравствуйте, (не в том разделе тему создал :( )
Вот какой вопросик появился: Допустим, у меня есть выборка из бд, которая возвращает мне двумерный массив вида: 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 нет. Как можно поступить в данной ситуации ? |
Вообще-то в JS и есть динамические массивы)
|
Что мне подсказывает, что так хранить данные - это не круто. Может, тебе лучше хранить в виде свойств объектов?
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); |
Вобще херня какая-то. Надеюсь эта дикая фигня используется не в публичном сайте, а где нибудь без палева, для себя?
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); |
Цитата:
Да, для себя, но в чём фигня-то? На сервере отрабатывает 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, ], }); } |
Не судите меня строго за мой индийский код, попробую ещё раз описать :)
Выше описал то, как я получаю массив. Лишние столбцы поубирал, оставил 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 - но может можно как-то без него :) |
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". Он может быть различным в результате запроса. |
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, нэ? |
Цитата:
|
Часовой пояс GMT +3, время: 01:01. |