Добавление и удаление массивов из больших объектов - PullRequest
0 голосов
/ 11 сентября 2018

У каждого пользователя есть массив в объекте (этот основной объект может содержать до 3000 массивов в любое время, что продолжает расти).

В массиве содержатся имя пользователя и последние 4 сообщения, отправленные пользователем (сообщения хэшируются методом быстрого хэширования). Старые сообщения выталкиваются.

Когда новое сообщение добавляется в массив, все элементы получают проверку, чтобы увидеть, если они равны. Будет ли лучший способ сделать это. Я уверен, что массивный объект с вложенными массивами немного медленный?

let messagescont = {}
 if (!messagescont.hasOwnProperty("a" + message.author.id)){
 //add new user to object
 messagescont["a" + message.author.id] = [{data})
 }else{
 //user has object
  messagescont["a" + message.author.id].push({data})
     if(messagescont["a" + message.author.id].length > 4){
         messagescont["a" + message.author.id].splice(0,1)
         let hashtable = [];
         messagescont["a" + message.author.id].forEach(messages => 
         hashtable.push(messages.data.hash))
         const arraysame = !!hashtable.reduce(function (a,b){ return (a === b)? a : NaN;});
     }
 }

Объект данных выглядит так

    const data = {
        hash: hashCode(message.content),  
        username: message.author.username,
        userid: message.author.id,
    }

Этот массив / объект / беспорядок массива

   {username [{data},{data},{data}],
   username2 [{data},{data},{data} }

1 Ответ

0 голосов
/ 11 сентября 2018

Как и @epascarello, подразумеваемый в комментарии: если нет проблем с измеряемой производительностью, не беспокойтесь об этом. Тем не менее, вот немного (микро) оптимизированная версия.

const messagesPerAuthor = {};
const contKey = "a" + message.author.id; // Avoid recomputing this value 6 times
if (!messagesPerAuthor[contKey]) {
  messagesPerAuthor[contKey] = [];
}
messagesPerAuthor[contKey].push({ data });
if (messagesPerAuthor[contKey].length > 4) {
  messagesPerAuthor[contKey].splice(0, 1);
}
let hasDuplicate = false;
if (messagesPerAuthor[contKey].length > 1) {
  // No need to bother with the `.some` indication if there's only one message
  const hashesSeen = {}; // could also be a `new Set()` for more modern browsers
  hasDuplicate = messagesPerAuthor[contKey].some(message => {
    const seen = hashesSeen[message.data.hash]; // true if we had seen this hash before
    hashesSeen[messages.data.hash] = true;
    return seen; // returning a truthy value will early-exit the `some` loop.
  });
}

Использование простого цикла в стиле for(var i = 0; i < messagesPerAuthor[contKey].length; i++) с break, вероятно, будет быстрее, чем some, но поскольку стиль FP находится в моде ...:)

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