.. Mam tę tablicę:

["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"]

Próbuję napisać kod, aby uzyskać to na wyjście:

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


.. To właśnie zrobiłem, ale jest źle:


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);


.. Jak mogę rozwiązać ten problem. Dzięki za pomoc

1
Martian.titan 27 czerwiec 2017, 04:41

4 odpowiedzi

Najlepsza odpowiedź

Najpierw pętlaj się przez wszystkie daty w tablicy i znajdują je do obiektu tally, zwiększając klucz odpowiadający dniu przez 1, jeżeli już istnieje lub wprowadzić nowy klucz o wartości 1, jeśli nie . Następnie zrób pętlę w pętli przez obiekt i wypełnij tablicę uniqueDates za pomocą daty i tablicy {x2}} z liczbą powtórzeń.

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);
1
elqueso101 27 czerwiec 2017, 01:54

Ponowne wykorzystanie kodu

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);

Ale myślę, że lepiej używać obiektu w przeciwieństwie do tablicy, gdzie można zachować daty jako klucze i liczy się jako wartości.

var chartDateMap = {};

for(var i=0; i<chartDate.length; i++) {
    if(!chartDateMap[chartDate[i]]) chartDateMap[chartDate[i]] = 0;
    chartDateMap[chartDate[i]]++;
}
1
shawon191 27 czerwiec 2017, 02:10

Wygląda na to, że został już odpowiedział, ale tutaj jest inna opcja oparta na trasie, którą już udałeś. Myślę, że skrócona wersja opublikowana jest prawdopodobnie najbardziej wydajna, ale jeśli nie jesteś zaznajomiony z redukcją, tutaj jest inna opcja.

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);
1
Jason Lemrond 27 czerwiec 2017, 02:01

Dałem to strzał i stwierdziłem, że było trochę łatwiejsze w trakcie traktowania dat / liczy się jako pary, a nie posiadanie ich w oddzielnych pojemnikach. Powinien być trywialny do konwersji z wyjścia poniższego do żądanego formatu.

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

Zakłada się, że Twoja lista dat jest nazywana data. output będzie listą 2-elementowych tablic, pierwszy element jest data i druga liczba.

Och, prawie zapomniałem: JSFiddle

1
wbadart 27 czerwiec 2017, 01:52