Поиск общности в объектных днях

#javascript

#javascript

Вопрос:

У меня есть массив объектов, в котором я хочу выяснить, какие последовательные дни являются наиболее распространенными среди всех из них, а затем выбрать первый день из этой пары последовательных дней.

 let data = [
   {
     name: "mike",
     city: "Los Angeles",
     days: ["2020-01-02", "2020-01-03","2020-01-18", "2020-01-19"]
   },

   {
     name: "Kenny",
     city: "Chicago",
     days: ["2020-04-02", "2020-04-12","2020-04-19"]

   },
 
   {
     name: "James",
     city: "Los Angeles",
     days: ["2020-05-02", "2020-05-12","2020-05-19"]
   },
    {
     name: "Maggie",
     city: "Los Angeles",
     days: ["2020-11-12", "2020-11-13","2020-05-19"]
   },
   {
     name: "Ricardo",
     city: "Los Angeles",
     days: ["2020-01-02", "2020-01-03","2020-05-19"]
   },
   {
     name: "Reeny",
     city: "Chicago",
     days: ["2020-01-02", "2020-01-04","2020-05-09"]
   },

];
  

так, например, для Лос-Анджелеса я бы хотел вернуться:

 {
   city: "Los Angeles", 
   day: "2020-01-02",
   people: ["mike", "ricardo"],
}
  

«Мэгги» не будет, поскольку ее доступные последовательные дни отображаются меньше, чем у Майка и Джеймса.

Для Майка и Джеймса, "2020-01-02" и "2020-01-03" больше всего подходит для Лос-Анджелеса.
Для Чикаго я бы хотел вернуть только пустую строку, поскольку у меня нет последовательных дней.

До сих пор я перебирал данные и перенес город в объект. Если город уже есть в объекте, я помещаю каждый day в существующий массив. Если city нет в хеш-объекте, то я просто устанавливаю его и устанавливаю равным days

 let obj = {};
data.forEach(x => {
   if (map[x.city]) {
       x.days.forEach(y => {
          map[x.city].push(y);
       })
   } else {
      map[x.city] = x.days;
   }
});

for (x in obj) {
    let arr = [...new Set(obj[x])]
    obj[x] = arr.sort();
}
  

мой результат — объект с городом в качестве ключа, а значение — дни (с удалением дубликатов с помощью Set) :

 obj = {
    "Los Angeles": ["2020-01-02", "2020-01-03","2020-01-18", "2020-01-19", "2020-05-02", "2020-05-12","2020-05-19", "2020-11-12", "2020-11-13"],
    "Chicago": ["2020-01-02", "2020-01-04","2020-04-02", "2020-04-12","2020-04-19", "2020-05-09"]
    }
  

С этого момента я не уверен, что делать. Я полагаю, что это возможно сделать, но я не знаю, какой следующий шаг здесь.

Ответ №1:

Вы можете использовать alasql https://github.com/agershun/alasql/wiki/Examples

с помощью alasql вы можете создавать: ОТДЕЛЬНЫЕ или ГРУППОВЫЕ и т. Д.

пример:

 // Fill table with data
var person = [ 
    { name: 'bill' , sex:'M', income:50000 },
    { name: 'sara' , sex:'F', income:100000 },
    { name: 'larry' , sex:'M', income:90000 },
    { name: 'olga' , sex:'F', income:85000 },
];

// Do the query
var res = alasql("SELECT * FROM ? person WHERE sex='F' AND income > 60000", [person]);

document.getElementById("result").innerHTML = JSON.stringify(res);