2014-01-22 2 views
1

у меня есть этот входной образец:Создание массива [п, [v, .., г]] из списка пар ключ-значение

var c1 = "s_A_3"; 
var c2 = "s_B_10"; 
var c3 = "s_B_9"; 
var c4 = "s_C_18"; 
var c5 = "s_C_19"; 
var c6 = "s_C_20"; 

который может быть легко сцепляются к:

var keypairs = ["A_3","B_10","B_9","C_18","C_19","C_20"]; 

И я хочу, чтобы преобразовать это многомерный массив, как это:

var groupArray = [["A",[3]],["B",[10,9]],["C",[18,19,20]]]; 

это как своего рода карт-Сортировочная. Как я могу это достичь?

+0

Каков ваш ожидаемый результат, когда ваш вход не упорядочен буквой, например. '[" A_3 "," C_20 "," B_10 "," C_19 "," B_9 "," C_18 "]'? Это '[[« A », [3]], [« C », [20]], [« B », [10]], [« C », [19]], [« B », [ 9]], ["C", [18]]] или '[[" A ", [3]], [" C ", [20, 19, 18]], [" B ", [10, 9]]] '? Или что-то совсем другое? – sqykly

ответ

1

Может быть что-то вроде этого:

function makeGroups(arr) { 
    var result = [], prev; 
    for(var i = 0; i < arr.length; i++) { 
     var x = arr[i].split("_"); 
     if (prev !== x[0]) { 
      prev = x[0]; 
      result.push([prev, []]); 
     } 
     result[result.length - 1][1].push(x[1]); // or .push(parseInt(x[1], 10)) 
    } 
    return result; 
} 

var keypairs = ["A_3","B_10","B_9","C_18","C_19","C_20"]; 
console.log(makeGroups(keypairs)); 
    // [["A",["3"]],["B",["10","9"]],["C",["18","19","20"]]] 

Demonstration


Описанный выше метод предполагает, что группы будут непрерывными (например, все B_ элементы появляются вместе). В случае, если ваш вход может быть из того, вы можете настроить этот алгоритм еще сгруппировать все элементы вместе, независимо от того, где они появляются на входе:

function makeGroups(arr) { 
    var result = [], keys = {}; 
    for(var i = 0; i < arr.length; i++) { 
     var x = arr[i].split("_"); 
     if (!(x[0] in keys)) { 
      keys[x[0]] = []; 
      result.push([x[0], keys[x[0]]]); 
     } 
     keys[x[0]].push(x[1]); // or .push(parseInt(x[1], 10)) 
    } 
    return result; 
} 

var keypairs = ["A_3","B_10","C_18","C_19","C_20","B_9"]; 
console.log(makeGroups(keypairs)); 
    // [["A",["3"]],["B",["10","9"]],["C",["18","19","20"]]] 

Demonstration

+0

Прохладный! Теперь попробуйте с помощью кнопок [[«A_3», «C_20», «B_10», «C_19», «B_9», «C_18»] '. Я не вижу «отсортированных букв» в OP. – sqykly

+0

@sqykly Я не вижу, где OP заявила, что она должна иметь возможность обрабатывать элементы в любом порядке. Входной образец сильно предположил, что вход будет в порядке, так что это решение, которое я дал. –

+0

Хорошая точка! На вопрос, каков ожидаемый результат в комментариях. – sqykly

0

Когда вам нужно указать «значение ключа пар "в программе JS, обычно наиболее целесообразно использовать ... пары значений ключа = D.

function solution(input) { 
    var kvp = {}, 
     result = []; 
    input.forEach(function (el) { 
     var cut = el.split("_"), 
      alpha = cut[0], 
      numeric = cut[1], 
      elsWithSameAlpha = kvp[alpha] = kvp[alpha] || []; 
     elsWithSameAlpha.push(numeric); 
    }); 
    Object.keys(kvp).forEach(function (key) { 
     result.push([key, kvp[key]]); 
    }); 
    return result; 
} 
Смежные вопросы