Javascript 返回子字符串时出现问题。第二双眼睛

Javascript 返回子字符串时出现问题。第二双眼睛,javascript,node.js,twitter,Javascript,Node.js,Twitter,我想我真的需要第二双眼睛。我在返回子字符串的值时遇到一些问题。我有一条tweet,我已经将其拆分为一个单词数组,然后我使用数组过滤器来查找Twitter句柄。当我找到句柄时,我想确保推文的末尾没有“:” 当我在控制台上记录我试图返回的值时,我得到的Twitter句柄末尾没有冒号。返回的值似乎仍然有冒号。看看下面。Twitter句柄必须通过所有逻辑才能返回 getTweetedBy: function(keywords) { // Assume keywords is equal to [

我想我真的需要第二双眼睛。我在返回子字符串的值时遇到一些问题。我有一条tweet,我已经将其拆分为一个单词数组,然后我使用数组过滤器来查找Twitter句柄。当我找到句柄时,我想确保推文的末尾没有“:”

当我在控制台上记录我试图返回的值时,我得到的Twitter句柄末尾没有冒号。返回的值似乎仍然有冒号。看看下面。Twitter句柄必须通过所有逻辑才能返回

getTweetedBy: function(keywords) {
    // Assume keywords is equal to ['@AP:', 'this', 'is', 'a', 'tweet']
    return keywords.filter(function(el){
      if(el.substring(0, 1) === '@') {
        if(el.slice(-1) === ':') {
          // the value logged here is "@AP" as it should be
          console.log(el.substring(0, el.length - 1));
          return el.substring(0, el.length - 1);
        }
      }
    });
  }
当我运行下面的代码时,控制台正在记录[“@AP:”]。我需要切除结肠

filterKeywords = commonFilters.filterKeywords(keywords);
tweetedBy = commonFilters.getTweetedBy(keywords);
storyLink = commonFilters.getTweetLink(keywords);
// The console is logging ["@AP:"]
console.log(tweetedBy);
任何帮助都将不胜感激

谢谢

编辑: 正如David在下面指出的,filter期望返回真实或虚假的语句。有人能想出一种比过滤更好的方法吗?只希望返回一个值。我知道我可以用一个循环来实现这一点,但是一个方法会更好


谢谢

过滤器
需要一个返回truthy/false值的函数


它不收集所提供函数返回的值,而是收集函数所针对的元素。有一系列选项,包括收集匹配的元素以及您要求的附加处理。

您希望分离过滤和映射功能。第一个过滤器删除不匹配的元素,第二个贴图将这些匹配的值转换为您想要的任何子字符串

getTweetedBy: function(keywords) {
    // Assume keywords is equal to ['@AP:', 'this', 'is', 'a', 'tweet']
    return keywords
        .filter(function(el){
            return (el.substring(0, 1) === '@' && el.slice(-1) === ':');
        })
        .map(function(el){
            // the value logged here is "@AP" as it should be
            console.log(el.substring(0, el.length - 1));
            return el.substring(0, el.length - 1);
        });
}
编辑:想在一个功能中使用它吗?给你:

getTweetedBy: function(keywords) {
    // Assume keywords is equal to ['@AP:', 'this', 'is', 'a', 'tweet']
    return keywords
        .reduce(function(matched, el){
            if (el.substring(0, 1) === '@' && el.slice(-1) === ':') {
                return matched.concat([ el.substring(0, el.length - 1) ]);
            }
            return matched;
        }, [])
}

谢谢你的回复,戴夫!有什么更好的方法吗?哇,老兄!非常有趣。这是一些伟大的见解。非常感谢。我想知道,如果你想的话,你可以研究一下这个,我只是好奇,这个方法在for循环旁边是如何执行的。哪一个跑得更快。显然,对于如此小的数组长度,这并不重要,但我很想知道。再次感谢!运行两个循环将比单个forEach(fn)循环慢,后者将比低级for循环慢。reduce函数可能由于
concat
-ing而性能不佳,但如果这是针对少数元素的数组,请选择最清晰的元素,以便将来进行编辑。