Javascript 如何找到数据集中每个成员的频率
我正在获取和分析一个大型数据集。 我想知道每个值在数据集中出现了多少 让我们举一个小例子来说明问题Javascript 如何找到数据集中每个成员的频率,javascript,d3.js,lambda,bigdata,Javascript,D3.js,Lambda,Bigdata,我正在获取和分析一个大型数据集。 我想知道每个值在数据集中出现了多少 让我们举一个小例子来说明问题 [ {"Year": "1997", "Company": "Ford", "Model": "E350", "Length": "2.34"}, {"Year": "2000", "Company": "Mercury", "Model": "Cougar", "Length": "2.38"} {"Year": "2001", "Company": "Ford", "Model":
[
{"Year": "1997", "Company": "Ford", "Model": "E350", "Length": "2.34"},
{"Year": "2000", "Company": "Mercury", "Model": "Cougar", "Length": "2.38"}
{"Year": "2001", "Company": "Ford", "Model": "Cougar", "Length": "2.38"}
]
我不知道我的值到底是什么,但我想通过散列得到这样的结果
[
{"Value": "Ford", "Frequency": 2},
{"Value": "Mercury", "Frequency": 1},
]
如果它不是动态的,并且我知道这些值,我会这样做:
var filteredCompany = data.filter(function(a) {
return /Ford/i.test(a.Company).lenght;
});
但是,我有一个非常大的数据集(900MBO),我需要以一种非常动态的方式进行这个过程
更新
var dataset = {}
d3.csv(link, function(data) {
dataset = data;
});
//Fetch data
var frequency = {};
var datasetlength = dataset.length;
for(var i = 0; i < datasetlength; i++){
var current = dataset[i];
if(!frequency.hasOwnProperty(current.company)) frequency[current.company] = 0;
frequency[current.company]++;
}
var数据集={}
d3.csv(链接、功能(数据){
数据集=数据;
});
//获取数据
var频率={};
var datasetlength=dataset.length;
对于(var i=0;i
您可以循环遍历所有条目,并将它们收集到一个对象中,其中键是名称,值是计数。初始数据如下所示:
{
"Ford" : 2,
"Mercury" : 1
}
您可以通过一个对象执行减少:
var frequency = hugeData.reduce(function(freq,current){
var currentCompany = current.Company;
if(!freq.hasOwnProperty(currentCompany)) freq[currentCompany] = 0;
freq[currentCompany]++;
return freq;
},{});
但是reduce
是ES5,有时速度较慢。您可以执行普通循环:
var frequency = {};
var hugeDataLength = hugeData.length;
for(var i = 0; i < hugeDataLength; i++){
var current = hugeData[i];
var currentCompany = current.Company;
if(!frequency.hasOwnProperty(currentCompany)) frequency[currentCompany] = 0;
frequency[currentCompany]++;
}
在过去的几个月里,我做了一个类似的壮举,你的浏览器的调试器对于这项工作来说是一个非常方便的工具,尤其是CPU分析器。您可以确定哪些操作实际导致了延迟。我不确定这是否是处理这么多数据的最有效方法(再说一遍,Javascript不是为大数据而设计的,所以效率不应该放在您的脑海中)
基本上,我会用一个关联数组跟踪频率,在所有数据中进行循环。如果当前的data.Company
不在关联数组中,它会将其作为键添加到数组中,然后输入一个键的频率。如果在数组中找到一个键,它会将频率增加1
谢谢!我收到了这样一条消息:uncaughttypeerror:Object#没有“reduce”方法@user3147036您需要一个数组才能使用reduce
。我认为您使用的数组与示例中的数组相似。我使用的是对象!在第二种解决方案中,我认为我们将得到重复,并且每次都忘记保存值名。@user3147036。只需选择JS和控制台面板。
var chartData = Object.keys(frequency).map(function(company){
var value = frequency[company];
return {
Value : company,
Frequency : value
}
});