删除包含数字的数组元素

Removing array elements that contain a number

我在 Whosebug 上看到了几个答案,但 none 对我有帮助。我有近 100,000 个单词的庞大数组,我试图从中删除所有包含数字的单词。我正在使用以下方法来做到这一点:

    for(var i = 0; i < words.length; i++){
      if (hasNumbers(words[i]) {
        words.splice(i, 1);
      }


   function hasNumbers(t)
      { return /\d/.test(t); }

它似乎有效,但不是一直有效,因为我仍然收到包含数字的单词。我可以更改什么以使其删除所有包含任何数字的单词?

(我在我的 js 中使用 p5.js)

那是因为当你在索引 i 处删除一个词时,下一个词的索引将是 i,但你仍然增加 i,从而跳过一个你从未检查过的词。

要解决这个问题,您可以向后遍历数组:

for(var i = words.length - 1; i >= 0; i--){
    // etc.

这是删除带数字的单词的更短方法:

words = words.filter(a => !hasNumbers(a));

最后,你真的应该调用你的第二个函数 hasDigits 而不是 hasNumbers。 "digit" 和 "number" 这两个词的含义略有不同。

这是一个使用 ES6 语法的片段,它定义了相反的函数 hasNoDigits 并将其应用于一些示例数据:

let words = ['abcd', 'ab0d', '4444', '-)#', '&9µ*'];

let hasNoDigits = s => /^\D*$/.test(s);

console.log(words.filter(hasNoDigits));

words = words.filter(a => !hasNumbers(a));

我已经开始写这个了,然后 trincot 回答了。他的回答是正确的,尽管随着 ES5 数组函数的流行和广泛使用,我觉得你可以把它简化很多。

window.addEventListener('load', function() {
  var data = [
    'w3.org',
    'google.com',
    '00011118.com'
  ]; //This is supposed to be your data, I didn't have it so I made it up.

  var no_nums = data.filter(function(item) {
    //Tests each string against the regex, inverts the value (false becomes true, true becomes false)
    return !/\d/.test(item);
  });
  var results = document.getElementById('results');
  no_nums.forEach(function(item) {
    results.innerHTML += item + '<br />';
    //Loops through each of our new array to add the item so we can see it.
  });
});
<div id="results">
</div>