07.01.2015, 13: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 в 13:43.
|
|
07.01.2015, 13:54
|
|
Профессор
|
|
Регистрация: 23.12.2013
Сообщений: 1,856
|
|
Вообще-то в JS и есть динамические массивы)
|
|
07.01.2015, 14:04
|
|
Профессор
|
|
Регистрация: 23.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 в 14:34.
|
|
07.01.2015, 14: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, 15: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, 15: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, 16: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, 16:32
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,577
|
|
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 в 16:37.
|
|
07.01.2015, 17:06
|
Интересующийся
|
|
Регистрация: 19.09.2014
Сообщений: 23
|
|
Сообщение от Aetae
|
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, нэ?
|
Честно, не пробовал с group by
В приведённом примере небольшой прорех, если вставить 5, то результат выйдет:
var data = [["Name","1"],["Name","2"],["Name","1"],["Name","2"],
["Name","5"],["Name","2"],["Name","1"],["Name","3"],["Name","3"],["Name","2"]];
i = 0, Name,1,Name,1,Name,1
i = 1, Name,2,Name,2,Name,2,Name,2
i = 2, Name,3,Name,3
i = 3, undefined
i = 4, Name,5
Но я понял что могу это доделать так, как нужно через .push()/.pop()
Большое спасибо всем за советы.
|
|
07.01.2015, 19:34
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,105
|
|
igorz,
var mas = [
["1", "Mike"],
["1", "Mike"],
["2", "John"],
["3", "Bob"],
["1", "Mike"],
["3", "Jim"]
];
mas.sort(function(a,b) { return a[0] - b[0]})
var result = [],len = mas.length - 1, n = mas[len][0];
for (var i= len; i > -1; i--) {
if (n != mas[i][0]) {n = mas[i][0]; result.unshift(mas.splice(i+1,mas.length-i+1))} }
result.unshift(mas)
alert(JSON.stringify(result))
var data = [["Name","1"],["Name","2"],["Name","1"],["Name","2"],
["Name","5"],["Name","2"],["Name","1"],["Name","3"],["Name","3"],["Name","2"]];
data.sort(function(a,b) { return a[1] - b[1]})
var result = [],len = data.length - 1, n = data[len][1];
for (var i= len; i > -1; i--) {
if (n != data[i][1]) {n = data[i][1]; result.unshift(data.splice(i+1,data.length-i+1))} }
result.unshift(data)
alert(JSON.stringify(result))
|
|
|
|