2015-10-25 4 views
0

У меня есть массив JavaScript:Комбинируя элементы 2 мерного массива

var arr = [["A",["05",90]],["A",["04",240]],["A",["03",235]],["B",["00",123]],["B",["01",234]]]; 

Я хочу окончательный массив выглядеть следующим образом:

var final = [["A",[["05",90],["04",240],["03",235]]],["B",[["00",123],["01",234]]]]; 

Окончательный массив формируется путем объединения всех 2-го элемента 2 когда соответствует 1-й элемент. пожалуйста, совет, как это может быть достигнуто в JavaScript

+0

Поскольку эти (' "А",' "B" ') являются _Strings_ вы можете безопасно переходите через _Object_ перед тем, как преобразовать обратно в _Array_ –

ответ

0

ключи объекта, как правило, самый простой способ для создания групп, как этот

var tmp = {}; // temporary grouping object 
// loop over data 
arr.forEach(function (item) { 
    // check if group started 
    if (!tmp.hasOwnProperty(item[0])) { 
     tmp[item[0]] = []; 
    } 
    // push data to group 
    tmp[item[0]].push(item[1]); 

}); 
// map temp object to results array 
var results = Object.keys(tmp).map(function (key) { 
    return [key, tmp[key]]; 
}); 

DEMO

+0

Большое спасибо за отличное решение. Он отлично работает. – kab

+0

charlietfl, можем ли мы также добавить логику сортировки, чтобы конечный массив выглядел как [["A", [["03", 235], ["04", 240], ["05", 90]]], [ B ", [[" 00 ", 123], [" 01 ", 234]]]] – kab

+0

обязательно ... выполните сортировку внутри последней части' map' ... 'tmp [key] .sort (function .. .' – charlietfl

0

Если начать с массивом вы дали:

var arr = [["A",["05",90]],["A",["04",240]],["A",["03",235]],["B",["00",123]],["B",["01",234]]]; 

затем создать новый массив для хранения значений:

var final = []; 

и просто комбинируют все элементы третьего уровня (например, ["05",90] и ["01",234]) каждого второго уровня (например, "A" и "B") путем циклического перемещения по массиву:

for(var i = 0; i < arr.length; i++) { 
    var found = false; 
    for(var j = 0; j < final.length; j++) { 
     if(arr[i][0] == final[j][0]) { 
      final[j][1].push(arr[i][1]); 
      found = true; 
      break; 
     } 
    } 
    if(!found) { 
     final[final.length] = [arr[i][0], [[arr[i][1][0], arr[i][1][1]]]]; 
    } 
} 

Это по существу метод сортировки: если «ключ» равен одному в конечном массиве, он добавляет его в этот. Если нет, добавьте его до конца final.

Вот рабочий пример на JSFiddle: link.

Это выводит массив:

["A", [["05", 90], ["04", 240], ["03", 235]]], ["B", [["00", 123], ["01", 234]]] 

в соответствии с просьбой.

Также, как прокомментировал @PaulS, было бы желательно использовать объекты вместо Strings, чтобы сделать их парами Key-Value. Но в моем ответе я застрял с массивами.

+0

необходимо его протестировать .. создает необычную вложенность – charlietfl

+0

@charlietfl Позвольте мне снова проверить его ... –