Вопрос по массиву
Здравствуйте, (не в том разделе тему создал :( )
Вот какой вопросик появился: Допустим, у меня есть выборка из бд, которая возвращает мне двумерный массив вида: 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 - но может можно как-то без него :) |
Цитата:
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, нэ? |
Цитата:
В приведённом примере небольшой прорех, если вставить 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() Большое спасибо всем за советы.:victory: |
igorz, :write:
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))
|
| Часовой пояс GMT +3, время: 06:44. |