Javascript转换数组

Javascript convert array

本文关键字:数组 转换 Javascript      更新时间:2023-09-26

我有一组谷歌分析数据:

[
["2016-01-01","google","335"],
["2016-01-01","bing","135"],
["2016-01-01","yahoo","35"],
["2016-01-02","google","145"],
["2016-01-02","bing","115"],
...........
]

它可以很大。获得以下两个数组的最简单、最快的方法是什么?

唯一日期值的数组:

["2016-01-01","2016-01-02","2016-01-03","2016-01-04"] - this is uniqe sorting date

按源对数据进行分组的对象数组:

[{
     source: 'google',
     data: [335, 145,.....] // lenght array=count unique date
}, {
    source: 'bing',
    data: [135, 115,.....]
}, ...
]

具有中间对象的解决方案。

var array = [["2016-01-01", "google", "335"], ["2016-01-01", "bing", "135"], ["2016-01-01", "yahoo", "35"], ["2016-01-02", "google", "145"], ["2016-01-02", "bing", "115"]],
    object = {},
    keys = {},
    uniqueData,
    grouped = [];
array.forEach(function (a) {
    keys[a[0]] = true;
    object[a[1]] = object[a[1]] || {};
    object[a[1]][a[0]] = a[2];
});
uniqueData = Object.keys(keys).sort();
grouped = Object.keys(object).map(function (k) {
    return {
        source: k,
        data: uniqueData.map(function (a) {
            return object[k][a] || 0;
        })
    };
});
document.write('<pre>' + JSON.stringify(uniqueData, 0, 4) + '</pre>');
document.write('<pre>' + JSON.stringify(grouped, 0, 4) + '</pre>');

一个简单的实现:

var arr = [
["2016-01-01","google","335"],
["2016-01-01","bing","135"],
["2016-01-01","yahoo","35"],
["2016-01-02","google","145"],
["2016-01-02","bing","115"],
];
var new_arr = [];
var sources = {};
for(var i = 0; i < arr.length; i++){
    if ( sources[arr[i][1]] ){
        sources[arr[i][1]].data.push(arr[i][2])
    } else {
      sources[arr[i][1]] = {
        source: arr[i][1],
        data: [ arr[i][2] ],
      }
    }
}
for (var key in sources) {
   if (sources.hasOwnProperty(key)) {
      new_arr.push(sources[key]);
   }
}
console.log(new_arr);

上面的代码为您提供了第二个数组。第一个数组应该更容易获得,对您来说是一个很好的练习:)

如果你可以使用lodash,那么它很简单:

var data = [
  ["2016-01-01","google","335"],
  ["2016-01-01","bing","135"],
  ["2016-01-01","yahoo","35"],
  ["2016-01-02","google","145"],
  ["2016-01-02","bing","115"]
];
var first = _.sortedUniq(data.map(x => x[0]).sort());
var second = _.entries(_.groupBy(data, x => x[1])).map(
    e => ({ source: e[0], data: e[1].map(d => d[2]) }) );
logs.innerText = JSON.stringify(first, null, 2) + "'n" + JSON.stringify(second, null, 2);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.11.1/lodash.min.js"></script>
<pre id="logs"></pre>