如何计算和转换具有特定条件的数组 javascript

How to count and convert an array with specific condition javascript

本文关键字:特定条件 javascript 数组 转换 何计算 计算      更新时间:2023-09-26

我有一个如下所示的数组。

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 (。

另一种方法可能是使用对象作为地图来计算外观。 labeltime可以连接起来形成一个人工键,用于计算不同的值。

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>