Суммирование массива + подсчет экземпляров - PullRequest
0 голосов
/ 18 января 2019

У меня есть массив с телефоном и меткой времени, которую я округлил до ближайшей четверти.

Массив ввода прилагается в конце моих комментариев.

То, что я пытаюсь сделать, довольно сложно, и я пытался использовать комбинацию функций map / filter / redund, но не уверен, в каком порядке мне следует подходить к нему.

То, что я хотел бы, это следующее, с подсчетом каждого телефона по времени, отсортированным по лучшим телефонам дня - кроме того, он должен отображать 0 для часов, которые отсутствуют.

Идеальный выход:

[{
  "OPPO R11s": [{
    "time": 00:00,
    "count": 20
  }, {
    "time": 00:15,
    "count": 13
  }, {
    "time": 00:30,
    "count": 0
  }, {
    "time": 00:45,
    "count": 23
  }], 
  "iPhone 7": [{
        "time": 00:00,
        "count": 20
      }]
}]

Ввод:

[
  {
    "phone": "OPPO R11s",
    "roundedTime": "10:45"
  },
  {
    "phone": "iPhone 7",
    "roundedTime": "03:15"
  },
  {
    "phone": "Samsung Galaxy XCover 4",
    "roundedTime": "11:45"
  },
  {
    "phone": "iPhone XS Max",
    "roundedTime": "12:00"
  },
  {
    "phone": "iPhone XS",
    "roundedTime": "01:00"
  },
  {
    "phone": "Samsung Galaxy Note9",
    "roundedTime": "02:30"
  },
  {
    "phone": "Samsung Galaxy J4",
    "roundedTime": "07:15"
  },
  {
    "phone": "iPhone XS Max",
    "roundedTime": "03:00"
  },
  {
    "phone": "Samsung Galaxy J4 Plus",
    "roundedTime": "02:45"
  },
  {
    "phone": "iPhone 6s",
    "roundedTime": "12:45"
  },
  {
    "phone": "iPhone XS Max AirPods Bundle",
    "roundedTime": "01:00"
  }]

Чтобы объяснить дальше:

  • Я бы хотел, чтобы телефон был ранжирован по общему количеству вхождений в массиве (т. Е. Если бы iPhone встречался чаще всего, он был бы вверху выходного массива).
  • Время в 15-минутных интервалах, так что оно будет просто проходить через массив и подсчитывать, например, сколько «iPhone 6s» у нас было в 00:15.

1 Ответ

0 голосов
/ 18 января 2019

ОК - я думаю, что вы хотите это:

Массив объектов, которые содержат имя телефона со списком случаев, когда этот телефон использовался. Массив должен быть отсортирован.

Сначала пройдите ввод, добавьте записи на карту со счетчиком. При каждом включении телефона ищите его список времени. Если время существует, увеличьте его, если нет, добавьте время. Затем сопоставьте список телефонов с массивом объектов, которые связывают данные телефона с именем телефона. Счетчик ходов и сортировка

const phoneMap = {};

const log = [
  {
"phone": "OPPO R11s",
"roundedTime": "10:45"
  },
  {
"phone": "iPhone 7",
"roundedTime": "03:15"
  },
  {
"phone": "Samsung Galaxy XCover 4",
"roundedTime": "11:45"
  },
  {
"phone": "iPhone XS Max",
"roundedTime": "12:00"
  },
  {
"phone": "iPhone XS",
"roundedTime": "01:00"
  },
  {
"phone": "Samsung Galaxy Note9",
"roundedTime": "02:30"
  },
  {
"phone": "Samsung Galaxy J4",
"roundedTime": "07:15"
  },
  {
"phone": "iPhone XS Max",
"roundedTime": "03:00"
  },
  {
"phone": "Samsung Galaxy J4 Plus",
"roundedTime": "02:45"
  },
  {
"phone": "iPhone 6s",
"roundedTime": "12:45"
  },
  {
"phone": "iPhone XS Max AirPods Bundle",
"roundedTime": "01:00"
  }];

log.forEach(function(logItem) {
  if (!phoneMap[logItem["phone"]]) {
    phoneMap[logItem["phone"]] = {count:1, times:[]};
  } else {
  	phoneMap[logItem["phone"]]["count"]++
  }

  var timeNode = phoneMap[logItem["phone"]]["times"].find(function(timeNode) {
    return timeNode["time"] === logItem["roundedTime"];
  })

  if (timeNode) {
    timeNode["count"]++;
  } else {
    phoneMap[logItem["phone"]]["times"].push({
      "time": logItem["roundedTime"],
      "count":1
    });
  }
})

var result = Object.keys(phoneMap).map(function(key){
	let obj = {};
  obj[key] = phoneMap[key];
  obj["count"] = phoneMap[key].count;
  delete phoneMap[key]["count"];
	return obj;
}).sort(function(a,b){
	return b.count - a.count;
});


console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...