如何只显示收到的最新数据?

时间:2017-09-12 17:47:13

标签: javascript node.js slack-api atlasboard

嘿我试图只显示当天的最新消息,

事情是我不知道怎么做,因为我的代码只拿起我写的第一个..

它甚至不是数组中的第一个对象..但它仍然需要它。

*请注意,此代码每隔几秒运行一次,以检查收到的新数据。

下面是我使用逻辑的响应和带逻辑的代码

enter image description here

isMOTD = false;
    var i = 0;
    var MOTD = "";
    while (messages[i].text && isMOTD == false) {
        i++;

     isMOTD = messages[i].text.includes("MOTD");

     if (isMOTD) 
       MOTD = messages[i].text;

    }

               if (isMOTD) {
        console.log(MOTD+' ' +'THIS IS MSG OF THE DAY')
                  $('.content', el).html(MOTD);
               }

      }
    };

2 个答案:

答案 0 :(得分:4)

我会做这样的事情:

var MOTD = messages.filter(message => message.text.includes("MOTD"))
    .reduce((a, b) => a.ts > b.ts ? a : b, {ts: -1, text: ''})
    .text;

$('.content', el).html(MOTD);

.filter()创建一个新数组,其中只包含带有MOTD的消息。

.reduce()正在经过过滤后的数组,只保留时间戳最高的消息。如果没有包含MOTD的字符串

,我也默认为空字符串

然后.text,只处理字符串,而不是时间戳。

编辑:我被要求添加更多解释。

首先:箭头功能。 EcmaScript 2015(javascript的新版本之一)提供了一种编写函数的新方法。当您看到=>时,请考虑“功能”。而不是这样做:

function (a, b) {
    return a + b;
}

你可以这样做:

(a, b) => {
    return a + b;
}

或者,如果在这种情况下只有一个语句,则可以省略大括号,分号和返回:

(a, b) => a + b

第二:.filter。所有数组都有一个名为.filter的函数。顾名思义,目的是过滤数组。您传入一个描述如何过滤它的函数,然后它创建一个只包含匹配元素的新数组。

请考虑以下事项:

var myArray = [1, 2, 3, 15, 18, 200];
var evenNumbers = myArray.filter(function (num) {
    return num % 2 == 0
});

它将循环遍历数组,并且对于数组的每个元素,它调用我指定的函数。如果函数返回true,则包含该元素。如果函数返回false,则不包括该元素。因此,对于此示例代码,evenNumbers将等于[2, 18, 200]

对于您的情况,我正在做的过滤器是:

messages.filter(function (message) {
   return message.text.includes("MOTD");  
});

因此,由此返回的数组将包含所有文本包含“MOTD”的消息。缺少“MOTD”的消息被排除在外。

第三:.reduce。所有阵列都具有此功能。 Reduce是一个非常通用的函数,但通常的目的是获取你的数组,并以某种方式将其缩小(或“减少”它)为单个值。您传递了一些您希望为数组的每个元素调用的函数。当您的函数返回一个值时,该值将继续运行并在下次运行该函数时使用。这是一个例子,我想总结一个数组中的所有数字:

var myArray = [1, 2, 3, 4];
var total = myArray.reduce(function (sumSoFar, current) {
    var newSum = sumSoFar + current;
    return newSum;
}, 0); //<--- this 0 is the initial value

所以这是它的工作原理:它将以0的初始值开始,然后调用该函数。此时SumSoFar将为0(因为初始值),并且当前为1(因为我们从数组的第一个元素开始,其值为1)。函数将它们加在一起,然后返回一个新的和。然后再次调用该函数,但现在sumSoFar为1(因为这是上次返回的内容),当前为2(因为我们正在查看第二个元素)。它增加1 + 2,并返回一个新的总和3.所以它继续,增加3 + 3得到6,然后加6 + 4得到10.我们完成了数组,所以最终值是10。

在您的情况下,我想逐步浏览数组并仅查找具有最新时间戳的邮件。我从初始值{ts: -1, text: ''}开始,因为如果 没有带有“MOTD”的消息,我希望将空字符串作为结果。

.reduce(function (mostRecentMessageSoFar, currentMessage) {
   if (mostRecentMessageSoFar.ts > currentMessage.ts) {
      return mostRecentMessageSoFar;
   } else {
      return currentMessage;
   }
}, {ts: -1, text: ''});

所以这将在数组中走过(记住,我们正在遍历过滤的数组,因此它们都有“MOTD”),它正在寻找最新的信息。任何时候currentMessage都比我们迄今为止发现的最好的更新,它切换到目前为止最好的那个。最后,我们从整个阵列中获取最新消息。

最终消息是一个看起来像这样的对象:

{
   type: 'message',
   user: 'U0GL3BR52',
   text: 'SOLVE MORE CASES #MOTD',
   ts: 1505236695.000533
}

只需将文本放入dom中,因此我可以使用.text

访问该文本

所以,从长篇来看,我的解决方案就是:

var MOTDMessages = messages.filter(function (message) {
   return message.text.includes("MOTD");
});

var MostRecentMOTDMessage = MOTDMessages.reduce(
   function (mostRecentMessageSoFar, currentMessage) {
      if (mostRecentMessageSoFar.ts > currentMessage.ts) {
         return mostRecentMessageSoFar;
      } else {
         return currentMessage;
      }
   }, {ts: -1, text: ''});

var MOTDText = MostRecentMOTDMessage.text;

$('.content', el).html(MOTDText);

答案 1 :(得分:0)

只需在时间降序后对信息进行排序:

 messages.sort((a,b) => b.ts - a.ts );

然后就拿第一个:

messages[0]