2013-02-15 4 views
4

Я надеюсь, что кто-то укажет мне в правильном направлении. У меня есть массив с количеством объектов, которые имеют свойства Date, Set и Value as Properties.
Мне нужно преобразовать это на стороне клиента в массив массивов, где каждый член массива хранит данные следующим образом: [Дата, значение набора 0, значение набора 1]
Я ищу решение, которое будет работать с любое количество «наборов», которое является тем, что усложняет для меня. Для любого предлагаемого решения может потребоваться использовать jQuery или другую библиотеку javascript, которую вы используете для этого. У меня нет проблем с этим, давайте просто сделаем это. :)
Пожалуйста, обратитесь к начальным и устанавливает ниже конца данных:Преобразование массива объектов в массив массивов

Первый из них только с двумя наборами:

var data = [ 
    { Date: "2/10/2013", Set: 0, Value: 1 }, 
    { Date: "2/10/2013", Set: 1, Value: 0 }, 
    { Date: "2/11/2013", Set: 0, Value: 15 }, 
    { Date: "2/11/2013", Set: 1, Value: 8 }, 
    { Date: "2/12/2013", Set: 0, Value: 12 },  
    { Date: "2/12/2013", Set: 1, Value: 11 },  
    { Date: "2/13/2013", Set: 0, Value: 15 }, 
    { Date: "2/13/2013", Set: 1, Value: 19 }, 
    { Date: "2/14/2013", Set: 0, Value: 10 },  
    { Date: "2/14/2013", Set: 1, Value: 20 } 
]; 

var endData = [ 
    [ "2/10/2013", 1, 0 ], 
    [ "2/11/2013", 15, 8 ], 
    [ "2/12/2013", 12, 11 ], 
    [ "2/13/2013", 15, 19 ], 
    [ "2/14/2013", 10, 20 ] 
]; 

А вот пример из 3-х наборов. Так, например, если данные были так:

var data = [ 
    { Date: "2/10/2013", Set: 0, Value: 1 }, 
    { Date: "2/10/2013", Set: 1, Value: 2 }, 
    { Date: "2/10/2013", Set: 2, Value: 3 }, 
    { Date: "2/11/2013", Set: 0, Value: 10 }, 
    { Date: "2/11/2013", Set: 1, Value: 15 }, 
    { Date: "2/11/2013", Set: 2, Value: 20 } 
]; 

Возвращается массив должен был бы быть таким:

var endData = [ 
    [ "2/10/2013", 1, 2, 3 ], 
    [ "2/10/2013", 10, 15, 20 ] 
]; 

Все указатели оценили.

+3

Если это o ption, рассмотрим преобразование его в объект, вместо этого введенный в строку даты. '{" 2/10/2013 ": [1,2,3]," 2/11/2013 ": [10,15,20]}' – crush

+1

Я считаю, что исходный формат будет лучше. Ваши конечные массивы содержат два типа данных, когда они должны (по «грамматическим» причинам) содержать только один тип. Нет причин, по которым вы не можете прокручивать объекты так же легко, как вы могли бы перебирать массивы. – Blazemonger

+0

Это сказало: что вы пробовали? – Blazemonger

ответ

1
;(function() { 
    var data = [ 
     { Date: "2/10/2013", Set: 0, Value: 1 }, 
     { Date: "2/10/2013", Set: 1, Value: 0 }, 
     { Date: "2/11/2013", Set: 0, Value: 15 }, 
     { Date: "2/11/2013", Set: 1, Value: 8 }, 
     { Date: "2/12/2013", Set: 0, Value: 12 },  
     { Date: "2/12/2013", Set: 1, Value: 11 },  
     { Date: "2/13/2013", Set: 0, Value: 15 }, 
     { Date: "2/13/2013", Set: 1, Value: 19 }, 
     { Date: "2/14/2013", Set: 0, Value: 10 },  
     { Date: "2/14/2013", Set: 1, Value: 20 } 
    ]; 

    var endData = {}; 

    for (var i = 0; i < data.length; ++i) { 
     var date = data[i].Date; 

     if (endData[date] === undefined) 
      endData[date] = []; 

     endData[date].push(data[i].Value); 
    } 

    var finalData = []; 

    for (var ed in endData) { 
     var a = [ed]; 

     for (var i = 0; i < endData[ed].length; ++i) { 
      a.push(endData[ed][i]); 
     } 

     finalData.push(a); 
    } 

    console.log(finalData); 
})(); 

Выход выглядит следующим образом:

var finalData = [ 
    ["2/10/2013", 1, 0], 
    ["2/11/2013", 15, 8], 
    ["2/12/2013", 12, 11], 
    ["2/13/2013", 15, 19], 
    ["2/14/2013", 10, 20] 
]; 
+0

Попытка этого. Дай мне секунду. EDIT: Это работает! Очень ценится. – iboros

+0

Я хочу, чтобы это обратное означало, как преобразовать массив массива в массив объектов в javascript. –

4

Используйте петлю и глобальную dat переменную, чтобы отслеживать, где вы находитесь в списке:

var endData=[], dat='', row=[]; 
for (var i=0; i<data.length; i++) { 
    var obj=data[i], val=obj.Value; 
    if (dat!=obj.Date) { 
     if (i) endData.push(row); 
     dat = obj.Date; 
     row = [dat, val]; 
    } else { 
     row.push(val); 
    } 
} 
endData.push(row); // last one 

http://jsfiddle.net/mblase75/rgJbq/

+0

Это определенно более кратким, и только один раз обрабатывает данные, поэтому я думаю, что он работает лучше. Я проверил, что он выводит правильный результат. Хорошая работа. – crush

+0

Требуется ли их сортировка по дате в массиве 'data'? – crush

+0

@crush Да, точно так же, как примеры, предоставленные OP. – Blazemonger

1
var endData = []; 
var indexes = {}; 

for(var i = 0, len = data.length; i < len; i++) { 
    if(indexes[data[i].Date] === undefined) { 
     indexes[data[i].Date] = endData.length; 
     endData.push([data[i].Date]); 
    } 
    endData[indexes[data[i].Date]][data[i].Set + 1] = data[i].Value; 
} 
+0

Это тоже дает правильный результат, но я не уверен, что он также зависит от предварительно отсортированных значений. – crush

Смежные вопросы