【问题标题】:Deleting only "strings" in array [duplicate]仅删除数组中的“字符串”[重复]
【发布时间】:2017-07-19 19:24:52
【问题描述】:

试图创建一个仅从数组中删除“字符串”的函数。我希望只剩下数字。我已经通过仅将数字添加到 newArray 来完成此操作,并且我正在研究 splice 方法但无法弄清楚如何编写它。正如您在代码中看到的删除工作,但在其位置返回未定义。

function numbersOnly(arr){

    for(var i = 0; i < arr.length; i++){
        if(typeof arr[i] === "string"){
        delete arr[i];
        }
    }
    console.log(arr);
 }
numbersOnly([1, "apple", -3, "orange", 0.5, 22, "hello", 6])

返回 [1, undefined, -3, undefined, 0.5, 22, undefined, 6]

【问题讨论】:

标签: javascript arrays


【解决方案1】:

var arr = [1, "apple", -3, "orange", 0.5, 22, "hello", 6];
var out = arr.filter(function(f) { return typeof(f) !== 'string';});
console.log( out );

【讨论】:

    【解决方案2】:

    如果你删除数组中的某物,就会留下一个未定义的空白空间。你需要shift数组,所以替换

     delete arr[i];
    

    arr=arr.slice(0,i).concat(arr.slice(i+1));
    i--;
    

    或使用拼接:

    arr.splice(i,1);
    i--;//dont jump over this index
    

    或使用 for 循环:

    for(var b=i;b<arr.length-1;b++){
      arr[b]=arr[b+1];
    }
    arr.length-=1;
    i--;
    

    或者你可以过滤:

    arr.filter(el=>typeof el==="number");//numbers only
    //or
    arr.filter(el=>typeof el!=="string");//not stringd
    

    【讨论】:

    • 如果你使用splice或类似的,所有的索引都会移动,所以i之后的值是错误的。
    • @Jonas w-这就是我要找的!谢谢
    • @robert amato 不客气 ;)
    【解决方案3】:

    您可能希望使用 array.splice() 而不是 delete,后者用于属性。

    【讨论】:

      【解决方案4】:

      我想换个方式

      function numbersOnly(arr){
      let numbers = [];
      for(var i = 0; i < arr.length; i++){
          if(typeof arr[i] === "number"){
          numbers.push(arr[i]);
          }
      }
      console.log(numbers);
      

      }

      【讨论】:

      • 你为什么混合letvar
      • 我只是复制了他的代码并添加了我的东西,我根本没有使用 var
      【解决方案5】:

      使用.splice(index, count)

      function numbersOnly(arr) {
        for(var i = 0; i < arr.length; i++) {
          if(typeof arr[i] === "string") {
            arr.splice(i, 1);
          }
        }
        console.log(arr);
      }
      numbersOnly([1, "apple", -3, "orange", 0.5, 22, "hello", 6]);

      【讨论】:

      • 如果输入数组的一行中有多个字符串,则中断。
      • Breaks?我听不懂你在说什么
      • 尝试在[ "foo", "bar", "baz" ] 上运行您的代码。你期望结果是什么?你实际上得到了什么?
      【解决方案6】:

      如果数组的单元格包含一个数字,并且该数字对if Number() 产生 true。然后该值将被添加到辅助数组并返回。

        function numbersOnly(arr){ 
      
            var numbersarr = [];
            var i;
            var k = 0;
            for (i=0; i< arr.length ;i++) {
          
            if (  Number(arr[i])   ) {
                 
                  numbersarr[k++] = arr[i];
               }
           }
            
            console.log(numbersarr);
            return numbersarr;
           }
      
          var strarr = [1, "apple", -3, "orange", 0.5,
                        22, "hello", 6 , "car", "123" , 
                        "zoo", "456"];
              
          numbersOnly(strarr);    
          numbersOnly(["foo","bar", "something"]);
          

      这就是你的输出:

        [1, -3, 0.5, 22, 6, "123", "456"]
      

      【讨论】:

      • 你试过这个吗?它应该删除所有元素(它们都是字符串),但它没有。也可以尝试输入[ "foo", "bar", "baz" ]
      • 是的,其实我试过了。我先运行代码,然后将其带到这里。我更新了答案以显示输出。
      • 您的代码将 "123""456" 留在数组中,即使它们是字符串。这是错误的。 (另外,你真的应该尝试在[ "foo", "bar", "baz" ] 上运行它。)
      • @melpomene 他没有在要求中指定“123”不被视为数字。和 123 个号码。
      • Javascript 本身指定 "123" 是一个字符串(而 123 是一个数字)。但即使你忽略了这一点,numbersOnly([ "foo", "bar", "baz" ]) 也会输出[ "bar" ]。你肯定不认为"bar" 被认为是一个数字吗?
      猜你喜欢
      • 2012-05-09
      • 1970-01-01
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      • 2022-09-29
      • 2018-06-09
      • 1970-01-01
      • 2012-09-15
      相关资源
      最近更新 更多