2016-02-23 90 views
-1

我有一个数组,我想从中删除所有的字符串元素。 这是我到目前为止。结果是不是我想要的,因为它只返回“自行车”按元素类型从数组中删除元素

此外,我在测试完成这样做,所以我需要一个主要功能,记录结果。

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

*“的结果不是我想要的,因为它仅返回‘自行车’” *是什么*应该*返回?因为它修改了原始数组。它应该返回它删除的字符串吗? –

+0

我想返回一个包含非字符串的元素的数组 – user3017513

+0

然后在我的答案中看到选项2。 :-) –

回答

0

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

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

我想这是一个锻炼,这就是为什么你不使用Array#filter

问题是你有你的return x里面你的for循环,所以你返回你找到的第一个字符串。

你至少有三种选择:

  1. 不要返回任何东西,因为removeStrings被修改原始数组。这很容易:只要删除return x;行。

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

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

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

尽管如此,我不会这么做;当我通过循环数组修改它,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'){

1

需要原始数组减少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] 
0

试试这个代码:

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 
    } 
} 
0

的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 
    }); 
    } 
} 

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

1

版本1,与阵列#滤波器

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版,与阵列#剪接和向后运行。

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>');