如何计算和转换具有特定条件的数组 javascript
How to count and convert an array with specific condition javascript
我有一个如下所示的数组。
var inputData = [
{label:1, time: Mon},
{label:1, time: Tue},
{label:2, time: Wed},
{label:2, time: Mon},
{label:2, time: Thu},
{label:3, time: Tue},
{label:3, time: Mon},
{label:3, time: Mon},
{label:3, time: Thu},
{label:1, time: Fri},
......
];
标签从1到3,时间从周一到周五。我想计算标签和时间的每个组合的数量。最后,我想要一个这样的数组:
var newArray = [
{label:1, time:Mon, count:19},
{label:1, time:Tue, count:34},
{label:1, time:Wed, count:36},
{label:1, time:Thu, count:21},
{label:1, time:Fri, count:32},
{label:2, time:Mon, count:55},
{label:2, time:Tue, count:25},
{label:2, time:Wed, count:87},
{label:2, time:Thu, count:44},
{label:2, time:Fri, count:56},
......
];
这就是我尝试过的,但不幸的是它不起作用。谁能帮忙?欣赏!
var labelArr = d3.map(inputData, function(d) {return d['label'];}).keys();
//labelArr = ["1","2","3"];
var filteredTime = d3.map(inputData, function(d) {return d['time'];}).keys();
//filteredTime = ["Mon", "Tue","Wed","Thu","Fri"];
var newArray = [];
for(var i = 0;i < filteredTime.length; i++){
var count = 0;
for(var j = 0; j < inputData.length; j++){
if(inputData[j]['time'] === filteredTime[i]){
for(var s = 0; s < labelArr.length; s++){
if(inputData[j]['label'] === labelArr[s]){
count++;
}
}
}
}
newArray.push({
'label':labelArr[s],
'time': filteredTime[i],
'count':count
})
}
这是您的代码稍微重新排列:-
var labelArr = d3.map(inputData, function(d) {
return d['label'];
}).keys();
var filteredTime = d3.map(inputData, function(d) {
return d['time'];
}).keys();
var newArray = [];
for (var i = 0; i < filteredTime.length; i++) {
for (var s = 0; s < labelArr.length; s++) {
var count = 0;
for (var j = 0; j < inputData.length; j++) {
if (inputData[j]['time'] == filteredTime[i] && inputData[j]['label'] == labelArr[s])
count++;
}
newArray.push({
'label': labelArr[s],
'time': filteredTime[i],
'count': count
});
}
}
您的主要问题是.keys
返回标签的字符串数组。 然后===
也比较类型返回 false ( int === string
(。
另一种方法可能是使用对象作为地图来计算外观。 label
和time
可以连接起来形成一个人工键,用于计算不同的值。
var map = {};
inputData.forEach(function(d) {
var key = "" + d.label + d.time;
if (!map[key]) { // if the key is not yet in the map...
d.count = 0; // add a count property to the object
map[key] = d; // and add the object to the map
}
map[key].count++ // increase object's counter
});
计数完成后,可以通过d3.values()
从映射中检索所需的数组:
var newArray = d3.values(map);
查看此代码片段以获取工作示例:
"use strict";
var inputData = [{
label: 1,
time: "Mon"
}, {
label: 1,
time: "Tue"
}, {
label: 2,
time: "Wed"
}, {
label: 2,
time: "Mon"
}, {
label: 2,
time: "Thu"
}, {
label: 3,
time: "Tue"
}, {
label: 3,
time: "Mon"
}, {
label: 3,
time: "Mon"
}, {
label: 3,
time: "Thu"
}, {
label: 1,
time: "Fri"
}, ];
var map = {};
inputData.forEach(function(d) {
var key = "" + d.label + d.time;
if (!map[key]) { // if the key is not yet in the map...
d.count = 0; // add a count property to the object
map[key] = d; // and add the object to the map
}
map[key].count++ // increase object's counter
});
var newArray = d3.values(map); // we are only interested in the array of values
//////// Just beautifying output below...
d3.select("p").append("text")
.text(JSON.stringify(newArray, null, " "));
p {
white-space: pre;
font-family: monospace;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<p></p>
相关文章:
- 如何附加<ul><李>元素位于某个特定条件的父元素列表之间
- I'我试图在文本区域中进行特定的输入,调用特定的javascript函数,但没有成功;不起作用
- 我应该将MVC视图特定的javascript文件放在哪个文件夹中
- 在特定条件下从存储在localStorage中的阵列中删除对象
- 如何用正则表达式替换特定的JavaScript注释
- 如何使用特定的javascript函数创建一个url,以便在加载页面时运行
- 如何在特定条件下完全禁用FullPage.js
- 根据特定条件使用ng显示/ng隐藏来显示/隐藏元素
- 停止计算以在特定条件下更新
- 用特定的javascript正则表达式替换每个单词
- 针对特定条件,抑制页面上的JavaScript错误
- 仅在特定条件下将字符串替换为 Javascript
- 如何计算和转换具有特定条件的数组 javascript
- 如何在特定条件下禁用javascript函数
- 在Javascript中获取具有特定条件的数组中的数组
- 使用javascript函数在特定条件下从后面的代码调用
- javascript,更改类,但仅当它满足特定条件时
- 如何分割javascript数组的对象与特定条件使用lodash/下划线
- 针对特定条件的Javascript Regex验证器
- 如何在javascript中根据特定条件替换字符