2017-02-20 59 views
1

我在JavaScript中JSON對象下面的代碼:如果有的Javascript族相似

{ 
apple: 'value', 
orange: 'value', 
string1Pear: 'value', 
string1Banana: 'value', 
string2Pear: 'value', 
string2Banana: 'value', 
pineapple: 'value' 
} 

我需要組給定對象類似的鍵不知道有這樣或者他們是什麼樣子。

最終的結果應該是這樣的:

{ 
apple: 'value', 
orange: 'value', 
string: { 
    string1: { 
     string1Pear: 'value', 
     string1Banana: 'value', 
    }, 
    string2: { 
     string2Pear: 'value', 
     string2Banana: 'value', 
    }, 
} 
pineapple: 'value' 
} 
+0

將'string'是靜態的前綴? – RomanPerekhrest

+0

可能是這會給你的想法:http://underscorejs.org/#groupBy –

+0

不,它可以是任何東西,但它會在開始的題。 –

回答

1

使用Object.keys()String.prototype.match()Array.prototype.reduce()功能的解決方案:

var data = { apple: 'value', orange: 'value', string1Pear: 'value', string1Banana: 'value', string2Pear: 'value', string2Banana: 'value', pineapple: 'value'}, 
 

 
    result = Object.keys(data).reduce(function (r, k) { 
 
     var parts = k.match(/(\w+\d+)([A-Z]\w+)/); 
 
     if (!parts) { 
 
      r[k] = data[k]; 
 
      return r; 
 
     } 
 
     r[parts[1]] = r[parts[1]] || {}; 
 
     r[parts[1]][k] = data[k] 
 
     return r; 
 
    }, {}); 
 

 
console.log(result);

+0

這是完美的! 我只是想知道,如果我想窩所有羣體像專用容器: 字符串{字符串1:{...} 1,字符串:{...}}? –

0

如果你的密鑰駱駝套管,並且你想要總是按照之前的任何字符串進行分組第一個大寫字母,這會工作:

const fruits = { 
 
     apple: 'value', 
 
     orange: 'value', 
 
     string1Pear: 'value', 
 
     string1Banana: 'value', 
 
     string2Pear: 'value', 
 
     string2Banana: 'value', 
 
     pineapple: 'value' 
 
    } 
 

 
    // Split by uppercase letters and take the first word. 
 
    function getGroup(key) { 
 
     return key.split(/(?=[A-Z])/)[0]; 
 
    } 
 

 
    // Group keys 
 
    let newObject = {}; 
 
    const keys = Object.keys(fruits); 
 
    
 
    for (var i = 0; i < keys.length; i++) { 
 
     const key = keys[i]; 
 
     const group = getGroup(key); 
 
     
 
     if (group === key) { 
 
     newObject[group] = fruits[key]; 
 
     } 
 
     else if (newObject.hasOwnProperty(group)) { 
 
     newObject[group][key] = fruits[key]; 
 
     } 
 
     else { 
 
     newObject[group] = {}; 
 
     newObject[group][key] = fruits[key]; 
 
     } 
 
    } 
 
    
 
    console.log(newObject);