количество JavaScript и группировка повторяющихся строк в массиве

1


У меня есть этот массив:

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


Как я могу решить эту проблему. Спасибо за вашу помощь

Теги:
arrays
count

4 ответа

1
Лучший ответ

Во-первых, проведите по всем датам в массиве и привяжите их к объекту tally путем либо увеличения ключа, соответствующего дате на 1, если он уже существует, либо создания нового ключа со значением 1, если это не так. После этого, сделать для в петле через объект и заполнить 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);
  • 0
    Большое спасибо, это то, что я искал.
  • 0
    Как я могу добавить ограничение для этого. Например, вывод только из определенного дня в другой. например, от «2017-06-22» до «2017-06-26»
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.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);
  • 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;
}, []);

Это предполагает, что ваш список дат называется data. output будет список 2-элементных массивов, первый элемент - дата, а второй - счетчик.

О, почти забыл: jsfiddle

  • 2
    Идеальный ответ. Спасибо
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]]++;
}
  • 0
    Спасибо за ваш ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню