【问题标题】:Remove different items from JS array [duplicate]从JS数组中删除不同的项目[重复]
【发布时间】:2021-02-15 16:30:40
【问题描述】:

我正在尝试解决一个需要创建函数 cleanArray 并从数组中删除各种项目的练习。这是我所能得到的

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

但这只会过滤掉我的null。我尝试将要删除的项目放在单独的数组中或一个接一个地删除,但它要么返回undefined,要么只过滤掉 0,即使它不是第一个要删除的项目。

我已经看到人们使用filterindexOf 的其他答案,但我想看看是否有办法使用splice。这里不能用逻辑运算符吗?

【问题讨论】:

标签: javascript arrays


【解决方案1】:

这不是您进行多重比较的方式。你的 if 条件可以写成:

arr[i] === null || 0 === 1 || "" === 1 || false === 1 || undefined === 1

现在很清楚为什么它不起作用了,对吧?您需要将arr[i] 与以下每个值进行比较:

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

注意:这种方法可能行不通。由于您正在从数组中删除元素(因此它变得越来越短),一旦删除了一个元素,您将处于错误的索引中,并且当您到达循环结束时,您将遇到未定义的索引错误。最后,将您的 return 语句移出循环。

我建议 如果你想远离Array.filter(),我建议创建一个新数组并只推入你想要的值:

function cleanArray(arr) {
  var newArr = [];
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] === null || arr[i] === 0 || arr[i] === "" || arr[i] === false || arr[i] === undefined) {
      continue;
    } else {
      newArr.push(arr[i]);
    }
  }
  return newArr;
}

【讨论】:

    【解决方案2】:

    您可以通过两个简单的步骤来简化此操作。

    1. 创建一个函数来验证 primitive 值是否为 falsy
    2. 使用过滤器或归约器将这些值与源数组隔离

    例子:

    const array = [1,2,"", null, undefined, 3, "4", true, 5, false, "6"]
    
    const isFalsy = value => !!value === false
    
    // this one is just to make the code more readable
    const isTrully = value => !isFalsy(value)
    
    const trullyValues = array.reduce((a, c) => isFalsy(c) ? a : [...a, c], [])
    
    // will return the same from above
    const filteredyTrullyValues = array.filter(isTrully)
    

    【讨论】:

    • "我想看看有没有办法用拼接"
    • 为什么? splice 适用于索引的更改,它会改变源数组。此外,它更复杂且性能更低。再次阅读您的问题并尝试先通过简单的方法解决。在现实世界的情况下,您将通过使用splice 而不是使用reducefilter 进行过滤操作来引入更多问题。
    【解决方案3】:

    这就够了:

    if (!arr[i]) {
      arr.splice(i, 1);
      return arr
    }
    

    因为null || 0 || "" || false || undefined 被评估为假。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-27
      • 2021-02-16
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      相关资源
      最近更新 更多