JS从2D数组中删除条目

时间:2018-08-14 09:57:47

标签: javascript arrays google-apps-script google-sheets

完全是JS的新手,为这个问题可能明显的解决方案表示歉意!

我正在尝试编写一些用于Google表格的代码,如果每个嵌套数组中的第3个值均为空,则基本上删除了2D数组的元素。

[[1,2,3],[4,5,,],[7,8,9],[,,,]

将成为

[[1,2,3],[7,8,9]]

我目前有:

if (bkLoc=='HALL'){
      var sumRng = sh.getRange('MIC_SUMM').getValues();
      for (var i =0; i<sumRng.length ; i++){
        if(sumRng[i][2] !== (undefined || '' || null)){
          micSumm.push(sumRng[i]);
        }
      }
    }

但是输出似乎包含空数组的负载,就像推动每个循环一样,我不确定为什么。

任何帮助将不胜感激!

EDIT1:所以在你们的帮助下,我成功了。使用Nikhils的答案,我现在将其用于IF

if (bkLoc=='HALL'){
      var sumRng = sh.getRange('MIC_SUMM').getValues();
      for (j =0; j<sumRng.length ; j++){
        var x = sumRng[j][2];
        if(x != 0 && x != '??'  && x != undefined){
          micSumm.push(sumRng[j]);
        }
      }
    }

但是说实话,我不太了解。我的理解是||是还是在我的原始代码中

if(sumRng[i][2] !== (undefined || '' || null))

如果测试的内容不包含未定义的OR或“”或null,则if语句应为true。我以为&&的意思是AND,所以我不清楚为什么会过去

如此愚蠢的歉意!

欢呼

4 个答案:

答案 0 :(得分:3)

在您当前的if条件下,undefined || '' || null的值为null。因此,条件最终变为sumRng[i][2] !== null

但是,由于您还需要检查undefined'',因此您需要更新条件

来自

if(sumRng[i][2] !== (undefined || '' || null)){

if(sumRng[i][2] !== undefined && sumRng[i][2] !== '' && sumRng[i][2] !== null){

答案 1 :(得分:3)

假设您在某个地方定义了micSumm并以其中的空白数组(var micSumm = [];)开始,那么您就走对了,问题出在这里:

if(sumRng[i][2] !== (undefined || '' || null)){

这不是您对JavaScript中的多个值进行检查的方式。评估方式为:

  1. sumRng[i][2]被评估;让我们将结果值称为left
  2. 评估
  3. undefined || '',结果为'';我们称之为temp¹
  4. temp || null'' || null)被求值,结果为null;我们称其为right
  5. 评估left !== right的结果

因此,您最终只检查null,而不检查undefined''

相反:

var value = sumRng[i][2];
if (value !== undefined && value !== '' && value !== null) {

或者您可以利用!= undefined还会检查null的事实:

var value = sumRng[i][2];
if (value != undefined && value !== '') {

...但是可能不太清楚。


¹为什么undefined || ''会产生''?因为表达式a || b的计算方式如下:

  1. 评估a
  2. 如果步骤1中的值是 truthy ,请确定||操作的结果
  3. 否则,请评估b并得出||操作的结果

undefined虚假,而不是真实。 ( falsy 值是用作布尔值时强制false的任何值。falsy值为undefinednull""0NaN,当然还有false。所有其他值为 truthy 。)

答案 2 :(得分:2)

您还可以使用过滤器(apps-script支持):

var filteredArr =  sumRng.filter(function(e) {return e[2];})

请注意,您将获得具有特定矩形尺寸的2D阵列。因此,值不可能为undefined。除非您专门设置了值null,否则不会返回null。如以下注释中所述,以上内容还过滤掉了0和布尔值false。因此,您可以使用

sumRng.filter(function(e) {return e[2].toString();})

sumRng.filter(function(e) {return e[2] || e[2] === false || e[2] === 0;})

参考文献:

Array#filter
Primitives
null
Comparison Operators
Truthy

答案 3 :(得分:1)

我仍然为为什么原来的OR方法不起作用而感到困惑。实际上,我去了reddit尝试看看是否可以再进行澄清,但是仍然无法解决。但是我感谢您的所有尝试。

我确实得到了难题的替代解决方案,不过这似乎是我所使用方法的简化版本。就是这样(由用户insertAlias提供)

if(sumRng[i][2]){}

很明显,这只会说实话,因此似乎符合要求。但请指出任何不足之处