2014-06-16 58 views
0

數組中的一個對象的屬性我有數組持有按以下格式大量的對象排序數組:如何基於JavaScript中

var data = [ 
    { 
    vs: "23434", 
    ip: "129.23.321.5" 
    }, 
    { 
    vs: "23454", 
    ip: "129.23.321.6" 
    }, 
    { 
    vs: "23434", 
    ip: "129.23.321.8" 
    } 
]; 

現在我想那裏有他們的方式排序是保存在以下格式對象的數組:

var dataFinal = [ 
    { 
    vs: "23434", 
    ip: ["129.23.321.5", "129.23.321.8"] 
    } 
    { 
    vs: "98647", 
    ip: ["129.23.321.6"] 
    } 
]; 

所以基本上,數據VAR將在它的多個對象,其中有可能是與相同 - 我想他們在一個地方的方式排序多個IP一個數組將有多個對象,每個vs對應一個,但是ip將是另一個數組將包含所有的IP爲那個與

什麼是最好的方式來做到這一點的JavaScript?

+1

你的意思是「可以有多個IP與同VS」 ? – merlin

+0

@merlin是的,謝謝你的注意。我已更新該帖子。 – KSubedi

+1

你有什麼嘗試?看起來'reduce'和'sort'的組合應該可以工作。 – pdoherty926

回答

2

我覺得這是一種編程技術問題是不相關的特定語言。

JavaScript不提供「本地」方式來執行此類任務。你在評論中描述的方式完全沒問題。如果您發現自己經常處理這些類型的任務,則可以使用一些第三方庫(如underscore)來減少生物代碼。

下劃線的方式來解決這個問題:

function mergeVsUseUnderscore(data) { 
    var dataFinal = [], 
    vsInFinal; 

    _.each(data, function(item) { 
     vsInFinal = _.find(dataFinal, function(itemFinal) { 
      return itemFinal.vs === item.vs; 
     }); 

     if(vsInFinal) { 
      vsInFinal.ip.push(item.ip); 
     } else { 
      dataFinal.push({ 
       vs: item.vs, 
       ip: [item.ip] 
      }) 
     } 
    }); 

    return dataFinal; 
} 

還有一點要提的,簡單地使用_.groupBy(data, 'vs')將產生:

{ 
    '23434': [ 
     { vs: '23434', ip: '129.23.321.5' }, 
     { vs: '23434', ip: '129.23.321.8' } 
    ], 
    '23454': [ { vs: '23454', ip: '129.23.321.6' } ] 
} 
+0

謝謝,我結束了使用_.groupBy – KSubedi

1
var data = [{ 
    vs: "1", 
    ip: "129.23.321.6" 
}, { 
    vs: "2", 
    ip: "129.23.321.8" 
}, { 
    vs: "0", 
    ip: "129.23.321.5" 
}, ]; 

var transformed = data.reduce(function (memo, datum) { 

    var filterFunc = function (_datum) { 

     return datum.vs === _datum.vs; 

    }; 

    if (!memo.some(filterFunc)) { 

     memo.push({ 
      vs: datum.vs, 
      ip: [datum.ip] 
     }); 

    } else { 

     memo.filter(filterFunc)[0].ip.push(datum.ip) 

    } 

    return memo; 

}, []); 

var sorted = transformed.sort(function (a, b) { 

    if (a.vs > b.vs) { 

     return 1; 

    } else if (a.vs < b.vs) { 

     return -1; 

    } else { 

     return 0; 

    } 

}); 

console.log(JSON.stringify(sorted)); 

Fiddle