Может быть что-то вроде этого:
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
Каков ваш ожидаемый результат, когда ваш вход не упорядочен буквой, например. '[" 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