2014-01-22 33 views
1

我有這個輸入樣本的列表:創建一個數組[N,[V,...,Z]]從鍵 - 值對

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」 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; 
} 
相關問題