【问题标题】:javascript array clean functionjavascript数组清理函数
【发布时间】:2015-07-06 05:17:27
【问题描述】:

如果数组有空值或空值,则清理数组的简单函数,所以如果我们有:

[ 'click1', 'click2', null, '', '', 'submitForm' ]

...它会返回:

[ 'click1', 'click2', 'submitForm' ]

这是我的代码:

function squeakyClean(arr) {
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] == null || arr[i] == '') {
      arr.splice(i);
    };
  };
  return arr;
}

我有一个 for 循环来检查数组中的每个值和一个 if 语句来查看它是否等于 null 或空字符串,如果是这样,我使用数组拼接方法删除该值,然后将干净的数组返回到外面for 循环。

如果您输入一个没有空字符串或空值的数组,它会起作用,但如果我输入[ 1, , 2, 3, 0, -1, 1.1 ],它会返回[1],这是不应该的。我在这里想念什么?

PS:我看过其他人如何在没有 for 循环和拼接方法的情况下解决这个问题,但我对如何使用这两个方法解决它很感兴趣。

【问题讨论】:

  • 也许这只是一个错字,但是:如果您输入一个像 [ 1, , 3, 4 ] 这样的数组,则数组索引 1 处的值(第二个值)既不是 null 也不是空字符串,但未定义。如果你不想这样,你需要用 (typeof arr[i]==='undefined') 过滤掉它。
  • 确实如此,我没有考虑。但是一旦我将 arr.splice(i) 更改为 arr.splice(i, 1) 它就可以完全工作。嗯

标签: javascript arrays splice


【解决方案1】:

考虑使用filter。比如下面会过滤掉nullundefinedfalse+0-0NaN""

arr.filter(Boolean)

【讨论】:

  • 正如我所提到的,我看到其他人是如何解决它的,我意识到还有其他更有效的方法可以做到这一点,但我对我的问题很感兴趣。还是谢谢
【解决方案2】:

除了使用.splice 方法之外,您的代码很好,您还必须指定要从该索引中删除的项目数。

示例:Array.splice(index, numberOfItemsFromIndex);

因此,要修复您的代码,它应该很简单:

function squeakyClean(arr) {
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] == null || arr[i] == '') {
      arr.splice(i, 1);
    };
  };
  return arr;
}

(Splice Documentation)

【讨论】:

    【解决方案3】:

    不使用拼接或其他函数,您可以通过另一个数组滑动所有空值,如下所示:

    function swipeArray(arr) {
      var newArr = new Array();
      for (var i = 0; i < arr.length; i++) {
        if (arr[i]||arr[i]===0||arr[i]===false)
          newArr.push(arr[i]);
      }
      return newArr;
    }
    
    var arr = new Array('click1', 'click2', null, '', '', 'submitForm',0,false);
    
    document.getElementById("out").textContent = JSON.stringify(swipeArray(arr))
    &lt;p id="out"&gt;&lt;/p&gt;

    编辑:如果扩展 if 条件,可以避免清理数组中的0false 或其他值。

    【讨论】:

      【解决方案4】:

      你的代码有两个问题:

      • 您必须将第二个参数传递给splice,以便告诉它您要删除多少项目
      • splice 的删除会重新索引数组。这意味着当您删除前一个项目时,您将跳过一个项目。您可以向后迭代解决它。
      function squeakyClean(arr) {
        for (var i = arr.length-1; i >= 0 ; --i)
          if (arr[i] == null || arr[i] == '')
            arr.splice(i, 1);
        return arr;
      }
      

      【讨论】:

      • 我后来意识到它并通过在拼接方法之后的 if 语句中添加 i-- 来解决它,但我更喜欢你的选择
      【解决方案5】:

      alert(
        [ 'click1', 'click2', null, '', '', 'submitForm' ].filter(function(x){
          return !!x; // or simple `return x;`
        })
      )

      【讨论】:

        猜你喜欢
        • 2014-03-29
        • 1970-01-01
        • 1970-01-01
        • 2020-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-27
        相关资源
        最近更新 更多