
07.01.2015, 12:40
|
Интересующийся
|
|
Регистрация: 19.09.2014
Сообщений: 23
|
|
Вопрос по массиву
Здравствуйте, (не в том разделе тему создал  )
Вот какой вопросик появился:
Допустим, у меня есть выборка из бд, которая возвращает мне двумерный массив вида:
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 нет. Как можно поступить в данной ситуации ?
Последний раз редактировалось igorz, 07.01.2015 в 12:43.
|
|

07.01.2015, 12:54
|
 |
Профессор
|
|
Регистрация: 22.12.2013
Сообщений: 1,856
|
|
Вообще-то в JS и есть динамические массивы)
|
|

07.01.2015, 13:04
|
 |
Профессор
|
|
Регистрация: 22.12.2013
Сообщений: 1,856
|
|
Что мне подсказывает, что так хранить данные - это не круто. Может, тебе лучше хранить в виде свойств объектов?
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);
Последний раз редактировалось Safort, 07.01.2015 в 13:34.
|
|

07.01.2015, 13:07
|
 |
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Вобще херня какая-то. Надеюсь эта дикая фигня используется не в публичном сайте, а где нибудь без палева, для себя?
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);
__________________
В личку только с интересными предложениями
|
|

07.01.2015, 14:06
|
Интересующийся
|
|
Регистрация: 19.09.2014
Сообщений: 23
|
|
Сообщение от danik.js
|
Вобще херня какая-то. Надеюсь эта дикая фигня используется не в публичном сайте, а где нибудь без палева, для себя?
|
Я не спец в 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,
],
});
}
|
|

07.01.2015, 14:37
|
Интересующийся
|
|
Регистрация: 19.09.2014
Сообщений: 23
|
|
Не судите меня строго за мой индийский код, попробую ещё раз описать
Выше описал то, как я получаю массив. Лишние столбцы поубирал, оставил 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 - но может можно как-то без него 
|
|

07.01.2015, 15:10
|
Профессор
|
|
Регистрация: 07.11.2013
Сообщений: 4,639
|
|
igorz, так ты изначально формируй sql-запрос и обрабатывай его правильно, а не как попало.
|
|

07.01.2015, 15:27
|
Интересующийся
|
|
Регистрация: 19.09.2014
Сообщений: 23
|
|
Сообщение от Rise
|
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". Он может быть различным в результате запроса.
|
|

07.01.2015, 15:32
|
 |
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,436
|
|
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, нэ?
__________________
29375, 35
Последний раз редактировалось Aetae, 07.01.2015 в 15:37.
|
|

07.01.2015, 16:00
|
Профессор
|
|
Регистрация: 07.11.2013
Сообщений: 4,639
|
|
Цитата:
|
И дальше как раз и пытаюсь его "обработать", разделив по отдельным массивам результаты по "monitor.cord".
|
так ты пытайся на сервере а не на клиенте, на клиент отправляй уже приготовленный как надо массив.
|
|
|
|