按元素类型从数组中删除元素

Remove elements from array by type of element

本文关键字:元素 删除 数组 类型      更新时间:2023-09-26

我有一个数组,我想从中删除所有字符串元素。这就是我目前所拥有的。结果不是我想要的,因为它只返回"自行车"

另外,我在测试完成中执行此操作,因此我需要有一个记录结果的主函数。

function ex06(){

  var mailBox = "mailbox";
  var twenty = 20;
  var isItRaining = true;
  var goat = "";
  var stringsArray = ["bicycle", "pocket", 3, mailBox, twenty, isItRaining, goat];
  var result = removeStrings();
  Log.Message("stringsArray looks like this after the removal of all the string elements: " + result);
  function removeStrings(){
    var i;
    var x
    for(i = 0; i < stringsArray.length; i++){
      if (typeof(stringsArray[i]) === 'string'){
        x = stringsArray.splice(i, 1);
        return x;
      } 
    }
  }
}

版本 1,带有 Array#filter

var a = [1, 2, "3", "4", true];
a = a.filter(function (e) {
    return typeof e !== 'string';
});
document.write('<pre>' + JSON.stringify(a, 0, 4) + '</pre>');

版本 2,带有 Array#splice 并向后运行。

var a = [1, 2, "3", "4", true],
    i = a.length;
while (i--) {
    if (typeof a[i] === 'string') {
        a.splice(i, 1);
    }
}
document.write('<pre>' + JSON.stringify(a, 0, 4) + '</pre>');

Array.prototype.filter 方法是你需要的:

var stringsArray = ["bicycle", "pocket", 3, mailBox, twenty, isItRaining, goat];
var result = stringsArray.filter(function(element) {
   return typeof element !== 'string';
});

您需要减少counter变量并检查原始数组

试试这个简单的例子

var a = [1,2,"3", "4", true];
for( var counter = 0; counter < a.length; counter++)
{
   if ( (typeof a[ counter ] ) == "string" ) 
   { 
     a.splice(counter,1); counter--; 
   }
}
console.log(a); //output [1, 2, true]

试试这段代码:

function ex06(){

  var mailBox = "mailbox";
  var twenty = 20;
  var isItRaining = true;
  var goat = "";
  var stringsArray = ["bicycle", "pocket", 3, mailBox, twenty, isItRaining, goat];
  var result = removeStrings();
  Log.Message("stringsArray looks like this after the removal of all the string elements: " + result);
  function removeStrings(){
     var newarray = [];
    var i;
    var x
    for(i = 0; i < stringsArray.length; i++){
      if (typeof(stringsArray[i]) !== 'string'){
        newarray.push(stringsArray[i]);
      } 
    }
   return newarray
  }
}

JavaScript 提供了原生方法来过滤数组,因此您可以更轻松地删除字符串元素:Array.prototype.filter 可以使该过程变得容易得多(并且可以防止在循环中使用拼接时的奇怪行为)。

function ex06(){

  var mailBox = "mailbox";
  var twenty = 20;
  var isItRaining = true;
  var goat = "";
  var stringsArray = ["bicycle", "pocket", 3, mailBox, twenty, isItRaining, goat];
  var result = removeStrings(stringsArray);
  Log.Message("stringsArray looks like this after the removal of all the string elements: " + result);
  function removeStrings(arrayWithString){
    return arrayWithString.filter(function(item) {
      return typeof item !== 'string'; // returns only items which are not strings
    });
  }
}

一小段建议:将数组传入函数,而不是从父范围引用它。这样你就有一个纯粹的、可重用的功能(并且没有你可能不想要的奇怪的副作用)。

我认为这是一个练习,这就是为什么你不使用Array#filter

问题是您的return xfor循环,因此返回找到的第一个字符串。

您至少有三个选项:

  1. 不要返回任何内容,因为removeStrings正在修改原始数组。这很简单:只需删除return x;行即可。

  2. 不要修改原始数组;相反,创建并返回一个省略字符串的新数组。在这种情况下,您将在循环之前从x = []开始,删除splice调用,然后将任何非字符串推送到x 上。

  3. 修改原始数组,然后创建并返回包含已删除字符串的新数组。在这种情况下,您将从循环内部删除return x,在循环之前x = [],然后将您删除的条目推送到x 上。然后在最后return x

在修改原始条目的任何地方,请注意 gurvinder372 的观点,即当您删除条目时,您不需要增加索引计数器,因为您最终会跳过下一个条目。

不过,我不会按照他建议的方式去做;当我循环访问修改它的数组时,for不是我想要的,我会伸手去while

i = 0;
while (i < stringsArray.length) {
    if (typeof stringsArray[i] === 'string'){
        stringsArray.splice(i, 1);
        // We leave `i` alone here, because we need to process
        // the new `stringsArray[i]` on the next pass
    } else {
        // Didn't remove this entry, move past it
        ++i;
    }
}

旁注:typeof 不是一个函数,它是一个运算符,没有必要将其操作数放在 ()
if (typeof stringsArray[i] === 'string'){