javascript计数和组重复数组中的字符串

时间:2017-06-27 01:41:21

标签: javascript arrays count


我有这个数组:

["2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-22", "2017-06-22", "2017-06-22", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-25", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-27"]

我正在尝试编写一个代码来输出:

['date', "2017-06-2", "2017-06-22", "2017-06-23", "2017-06-24", "2017-06-25"]
['repeated_count', 5, 9, 3, 8, 4]


这就是我所做的,但这是错误的:


var ChartDate = the above data ↑
var ChartDates = [];
var RepeatedNum = [];
for (i =0; i <= ChartDate.length; i++) {
    if (ChartDates.indexOf(ChartDate[i]) < 0) {
        if (typeof ChartDate[i] !== 'undefined') {
            ChartDates.push(ChartDate[i]);
            RepeatedNum.push('T');
        }
    }else {
        RepeatedNum.push(1);
    }
}
console.log(ChartDates);
console.log(RepeatedNum);


我该如何解决这个问题。谢谢你的帮助

4 个答案:

答案 0 :(得分:1)

我试了一下,发现将日期/计数视为成对更容易,而不是将它们放在单独的容器中。将下面的输出转换为您想要的格式应该是微不足道的。

let output = data.reduce((acc, d)=>{
    e = acc.find(e=> e[0] == d);
    if(e) e[1]++;
    else acc.push([d, 1]);
    return acc;
}, []);

这假设您的日期列表名为dataoutput将是一个2元素数组的列表,第一个元素是日期,第二个元素是计数。

哦,差点忘了:jsfiddle

答案 1 :(得分:1)

首先,循环遍历数组中的所有日期,并将它们计入tally对象,方法是将对应于日期的键增加1(如果已存在),或者创建值为1的新键。它不是。之后,在对象中执行for-in循环,并使用日期填充uniqueDates数组,并使用重复次数填充repeatedNumber数组。

const dates = ["2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-22", "2017-06-22", "2017-06-22", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-25", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-27"];

const tally = {};
const uniqueDates = ['date'];
const repeatedNumber =['repeated_count'];

for(let i = 0; i < dates.length; i++) {
  if(tally.hasOwnProperty(dates[i])) {
    tally[dates[i]]++;
  } else {
    tally[dates[i]] = 1;
  }
};

for(let date in tally) {
  uniqueDates.push(date);
  repeatedNumber.push(tally[date]);
}

console.log(uniqueDates);
console.log(repeatedNumber);

答案 2 :(得分:1)

看起来这已经得到了回答,但这是另一种选择,基于你已经走过的路线。我认为发布的reduce版本可能效率最高,但如果你不熟悉reduce,那么这里是另一种选择。

var ChartDate = ["2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-22", "2017-06-22", "2017-06-22", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-25", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-27"]
var ChartDates = ['date'];
var RepeatedNum = ['repeated_count'];
for (i = 0; i < ChartDate.length; i++) {
    if (!ChartDates.includes(ChartDate[i])) {
        ChartDates.push(ChartDate[i]);
        RepeatedNum.push(1);
    } else {
        var index = ChartDates.indexOf(ChartDate[i]);
        RepeatedNum[index] = RepeatedNum[index] + 1;
    }
}
console.log(ChartDates);
console.log(RepeatedNum);

答案 3 :(得分:1)

重复使用您的代码

var chartDate = ["2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-21", "2017-06-22", "2017-06-22", "2017-06-22", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-23", "2017-06-25", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-26", "2017-06-27"];

var chartDates = ['date'];
var repeatedNum = ['repeated_count'];
for (i = 0; i <= chartDate.length; i++) {
  if (chartDates.indexOf(chartDate[i]) === -1) {
    if (typeof chartDate[i] !== 'undefined') {
      chartDates.push(chartDate[i]);
      repeatedNum[chartDates.length - 1] = 1;
    }
  } else {
    var dateIndex = chartDates.indexOf(chartDate[i]);
    repeatedNum[dateIndex]++;
  }
}
console.log(chartDates);
console.log(repeatedNum);

但我认为最好使用一个对象而不是数组,在这里你可以将日期保存为键并计为值。

var chartDateMap = {};

for(var i=0; i<chartDate.length; i++) {
    if(!chartDateMap[chartDate[i]]) chartDateMap[chartDate[i]] = 0;
    chartDateMap[chartDate[i]]++;
}