如何只显示最新收到的数据?
How to display only the latest data received?
嘿,我想只显示当天的最新消息,
问题是我不确定该怎么做,因为我的代码只选择了我第一次写的代码..
它甚至不是数组中的第一个对象..但它仍然需要它。
*请注意,此代码每隔几秒运行一次,以检查收到的新数据。
下面是我正在使用我的逻辑的响应和带有逻辑的代码
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);
}
}
};
按时间降序排列您的消息:
messages.sort((a,b) => b.ts - a.ts );
那就拿第一个吧:
messages[0]
我会这样做:
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"。而不是这样做:
function (a, b) {
return a + b;
}
你可以这样做:
(a, b) => {
return a + b;
}
或者如果只有一个语句,如本例,您可以省略大括号、分号和 return:
(a, b) => a + b
第二个:.filter
。所有数组都有一个名为 .filter
的函数。顾名思义,目的就是过滤数组。您传入一个描述您希望如何过滤它的函数,然后它会创建一个仅包含匹配元素的新数组。
所以请考虑以下几点:
var myArray = [1, 2, 3, 15, 18, 200];
var evenNumbers = myArray.filter(function (num) {
return num % 2 == 0
});
它将遍历数组,并为数组的每个元素调用我指定的函数。如果函数 return 为真,则包含该元素。如果函数 returns 为 false,则不包含该元素。因此对于此示例代码,evenNumbers
将等于 [2, 18, 200]
对于你的情况,我正在做的过滤器是:
messages.filter(function (message) {
return message.text.includes("MOTD");
});
因此 return 编辑的数组将包含文本包含 "MOTD" 的所有消息。缺少 "MOTD" 的消息将被排除。
第三名:.reduce
。所有数组也都具有此功能。 Reduce 是一个非常通用的函数,但一般目的是获取您的数组,并以某种方式将其简化(或 "reduce" 它)为单个值。您传入一些您希望为数组的每个元素调用的函数。当您的函数 return 是一个值时,该值将被结转并在下一次函数为 运行 时使用。这是一个我想总结数组中所有数字的示例:
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(因为初始值),current 为 1(因为我们从数组的第一个元素开始,它的值为 1)。该函数将它们相加,然后 return 的新总和为 1。然后再次调用该函数,但现在 sumSoFar 为 1(因为这是上次 returned 的值),当前为2(因为我们正在查看第二个元素)。它添加 1 + 2,并且 returns 是 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: ''});
所以这将遍历数组(请记住,我们正在遍历 filtered 数组,因此它们都包含 "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);
嘿,我想只显示当天的最新消息,
问题是我不确定该怎么做,因为我的代码只选择了我第一次写的代码..
它甚至不是数组中的第一个对象..但它仍然需要它。
*请注意,此代码每隔几秒运行一次,以检查收到的新数据。
下面是我正在使用我的逻辑的响应和带有逻辑的代码
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);
}
}
};
按时间降序排列您的消息:
messages.sort((a,b) => b.ts - a.ts );
那就拿第一个吧:
messages[0]
我会这样做:
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"。而不是这样做:
function (a, b) {
return a + b;
}
你可以这样做:
(a, b) => {
return a + b;
}
或者如果只有一个语句,如本例,您可以省略大括号、分号和 return:
(a, b) => a + b
第二个:.filter
。所有数组都有一个名为 .filter
的函数。顾名思义,目的就是过滤数组。您传入一个描述您希望如何过滤它的函数,然后它会创建一个仅包含匹配元素的新数组。
所以请考虑以下几点:
var myArray = [1, 2, 3, 15, 18, 200];
var evenNumbers = myArray.filter(function (num) {
return num % 2 == 0
});
它将遍历数组,并为数组的每个元素调用我指定的函数。如果函数 return 为真,则包含该元素。如果函数 returns 为 false,则不包含该元素。因此对于此示例代码,evenNumbers
将等于 [2, 18, 200]
对于你的情况,我正在做的过滤器是:
messages.filter(function (message) {
return message.text.includes("MOTD");
});
因此 return 编辑的数组将包含文本包含 "MOTD" 的所有消息。缺少 "MOTD" 的消息将被排除。
第三名:.reduce
。所有数组也都具有此功能。 Reduce 是一个非常通用的函数,但一般目的是获取您的数组,并以某种方式将其简化(或 "reduce" 它)为单个值。您传入一些您希望为数组的每个元素调用的函数。当您的函数 return 是一个值时,该值将被结转并在下一次函数为 运行 时使用。这是一个我想总结数组中所有数字的示例:
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(因为初始值),current 为 1(因为我们从数组的第一个元素开始,它的值为 1)。该函数将它们相加,然后 return 的新总和为 1。然后再次调用该函数,但现在 sumSoFar 为 1(因为这是上次 returned 的值),当前为2(因为我们正在查看第二个元素)。它添加 1 + 2,并且 returns 是 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: ''});
所以这将遍历数组(请记住,我们正在遍历 filtered 数组,因此它们都包含 "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);