JS 数组方法

JS array methods

提问人:nmA 提问时间:4/16/2020 最后编辑:nmA 更新时间:11/17/2023 访问量:95

问:

我有一个段落存储在一个名为 的变量中。story

story = story text;(示例)。

项目的第一步是将 story 变量中的每个单词分开,并将其存储在名为 的数组中。storyWords

很简单,检查。

现在它希望我们遍历、过滤掉新数组并将其存储在一个名为 的变量中。storyWordsunnecessaryWordsbetterWords

unnecessaryWords = ['extremely', 'literally', 'actually'];

这是我的代码:

const betterWords = storyWords.filter(word => {
  if(word !== unnecessaryWords)
    return word;
});

使我相信这应该起作用的是基于以下代码:

const betterWords = storyWords.filter(word => {
  if(word !== 'extremely')
   if(word !== 'literally')
    if(word !== 'actually')
     return word;
})

我在这里有什么不明白的?

JavaScript 数组

评论

2赞 CertainPerformance 4/16/2020
unnecessaryWords = 'extremely', 'literally', 'actually';这是你的实际代码吗?如果是这样,则您正在调用逗号运算符,并且只分配了逗号运算符,其他运算符将丢失actually
0赞 nmA 4/16/2020
对不起,不是。 unnecessaryWords 是一个数组。
0赞 Phil 4/16/2020
“很简单,检查一下。”👈 我很想看到这部分,因为“词”的定义是高度可变的
1赞 Phil 4/16/2020
仅供参考,回调应返回一个 .您返回的是字符串或 .Array.prototype.filter()Booleanundefined

答:

1赞 Terry 4/16/2020 #1

如果要排除该条目,只要它与任何不必要的单词匹配,即数组:

const unnecessaryWords = ['extremely', 'literally', 'actually'];

...那么你可以简单地返回 ,这意味着 “如果 不包含在数组中,我们要保留它”:!unnecessaryWords.includes(word)wordunnecessaryWords

const betterWords = storyWords.filter(word => !unnecessaryWords.includes(word));

Array.prototype.includes 在与 中的任何数组成员匹配时将返回 true。wordunnecessaryWords

概念验证:

const unnecessaryWords = ['extremely', 'literally', 'actually'];
const storyWords = ['Lorem', 'ipsum', 'extremely', 'dolor', 'sit', 'actually', 'amet'];

const betterWords = storyWords.filter(word => !unnecessaryWords.includes(word));

console.log(betterWords);

评论

0赞 nmA 4/16/2020
不,它希望我们将剩余的单词存储在变量 betterWords 中。
1赞 Terry 4/16/2020
@nmA 刚刚更新了我的答案:它不应该做你期望的事情吗?如果你包含成员,那么它将是 .这不是你想要的吗?storyWords['foo', 'bar', 'extremely']betterWords['foo', 'bar']
0赞 nmA 4/16/2020
我已经修复了帖子,但原始帖子可能具有误导性。let story = '这是一个非常酷的字符串的例子';const storyWords = story.split(' ');let unnecessaryWords = ['真的', '酷'];现在我们想过滤掉不必要的单词并将结果存储在 betterWords 中。
0赞 Terry 4/16/2020
@nmA 代码应该按照您描述的方式按预期工作。
0赞 nmA 4/16/2020
是的,谢谢。我忽略了.includes()的语法。
-1赞 Mosia Thabo 4/16/2020 #2

您可以尝试两种方法。使用一个 和 就像我在下面演示的那样。Array.forEach()Array.filter()

// Just for Illustration, let's initialize a list representing storyWords
var storyWords = ['story','extremely', 'global','actually', 'javascript','c-sharp','literally'];

var unnecessaryWords = ['extremely', 'literally', 'actually'];

//First using simple loop
var betterWordsLooped = [];

storyWords.forEach((word)=>
{
  if(!unnecessaryWords.includes(word))
  {
    betterWordsLooped.push(word);
  }
});

console.log(betterWordsLooped);

//Secondly Using Filter
var betterWordsFiltered = storyWords.filter((word)=> !unnecessaryWords.includes(word));

console.log(betterWordsFiltered);

在此代码中:我们要检查变量的值是否与字符串数组中包含的任何项目匹配。请记住,使用的模式是 where 是 a 和 一个字符串变量,您希望在其中匹配其值。!unnecessaryWords.includes(word))wordunnecessaryWordsArray.propotype.includes()someArray.includes(someVar)someArray[]someVarsomeArray

评论

0赞 nmA 4/16/2020
我假设他们希望我们从函数中返回一个数组。初始化新数组并使用 .push 工作正常。我不明白的是为什么它必须这样写:!unnecessaryWords.includes(word) 而不是:word.includes(!unnecessaryWords)
0赞 Mosia Thabo 4/16/2020
word.includes(!unnecessaryWords)这是一个字符串,而不是一个列表。 是一个列表。您只能检查是否包含在其中wordunnecessaryWordswordunnecessaryWords
0赞 Mosia Thabo 4/16/2020
我将通过注释稍微更改代码,以便您理解。
0赞 Ben Aston 4/16/2020 #3

下面使用正则表达式和 String#matchAll 来匹配单词边界后面的单词字符序列。然后使用 Array#filter 过滤掉不必要的单词。

const unnecessaryWords = ['extremely', 'literally', 'actually']

function betterWords(text) {
  const words = [...text.matchAll(/\b\w+/gu)].flat()
  return words.filter((w) => !unnecessaryWords.includes(w))
}

const text = 'literally the story text'
console.log(betterWords(text))