Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS从2D数组中删除条目_Javascript_Arrays_Google Apps Script_Google Sheets - Fatal编程技术网

Javascript JS从2D数组中删除条目

Javascript JS从2D数组中删除条目,javascript,arrays,google-apps-script,google-sheets,Javascript,Arrays,Google Apps Script,Google Sheets,对JS来说完全是新手,所以为这个问题可能显而易见的解决方案道歉 我正在尝试编写一段代码,用于google sheets,如果每个嵌套数组中的第三个值为空,则基本上删除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<

对JS来说完全是新手,所以为这个问题可能显而易见的解决方案道歉

我正在尝试编写一段代码,用于google sheets,如果每个嵌套数组中的第三个值为空,则基本上删除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]);
        }
      }
    }
但老实说,我并不真正理解它。我的理解在我的原始代码中是| | is左右

ifsumRng[i][2]!==未定义的| | | | |空

如果测试内容不包含undefined或null,If语句应该为true。我认为&&的意思是,所以我不清楚为什么会这样

为自己的愚蠢道歉

Cheers

在当前的if条件中,未定义的| | | | | | | null计算为null。因此,该条件最终变为sumRng[i][2]!==null

但是,由于您需要检查未定义的和,因此您需要更新您的条件

假设您在某个地方定义了micSumm,并在其中使用了一个空白数组var micSumm=[];,那么您就走上了正确的道路,问题是:

if(sumRng[i][2] !== (undefined || '' || null)){
这不是在JavaScript中对多个值进行检查的方式。计算方法是:

对sumRng[i][2]进行求值;让我们调用结果值left 对未定义的| |进行求值,结果是;我们称之为temp 对temp | | null | | null求值,结果为null;我们这样说是对的 计算left!==right的结果 因此,最终只检查null,而不是未定义或未定义

相反:

var value = sumRng[i][2];
if (value !== undefined && value !== '' && value !== null) {
或者,您可以利用事实!=undefined还检查空值:

…但这可能不太清楚

为什么未定义的| |会导致?因为表达式a | | b的计算如下:

评估 如果步骤1中的值为真,则将其作为| |运算的结果 否则,计算b并将其作为| |运算的结果
undefined是falsy,而不是truthy。falsy值是用作布尔值时强制为false的任何值。falsy值是undefined、null、0、NaN,当然还有false。所有其他值都是truthy。

您也可以使用应用程序脚本支持的过滤器:

var filteredArr =  sumRng.filter(function(e) {return e[2];})
请注意,您得到的是一个具有特定矩形维度的2D数组。因此,不存在未定义值的可能性。除非您专门将值设为null,否则不会返回null。如下面的注释所述,上面的值也会过滤掉0和布尔值false。因此,您可以使用

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

参考资料:


我仍然在为我原来的方法或方法不起作用的原因而挣扎。事实上,我去了reddit,想看看我是否能得到更多的澄清,但它还是不进去。但我感谢你们的帮助

我确实找到了一个解决这个难题的替代方案,它似乎是我所使用的东西的一个更精简的版本

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

显然,这只会被认为是真实的,因此似乎符合要求。但请指出任何缺点

向回答者发出警告:谷歌应用程序脚本不是现代的JavaScript。它大致上是ES3加一点,没有大部分ES5,当然也没有任何ES2015+。使用Array.filters函数。sumRng[i][2]!==未定义的| | | | | null真的是错误的。@ArupRakshit在工作表中可用吗?@ArupRakshit-没有标准的Array.filters函数。如果您指的是Arrayfilter单数形式,而不是GAS形式,请参阅我上面的第一条评论。在语句中,If sumRng[i][2]!==undefined | | | | | | | | | | | | | | null首先计算为| | | | | | null,然后计算为null再计算为null,然后将其与sumRng[i][2]进行比较。即,如果sumRng[i][2]!==null。RangegetValues的最里面的元素结果将有一个值,或者从不为null,因此该语句将始终为真。!==总是比!=:@ArupRakshit好-我不认为这是绝对的。但我会在这里使用!==我不是在挑战,而是在这里提问。强制是一个好特性吗?我认为隐含的东西是一些时间不好。@ArupRakshit-总的来说,我同意显式比隐式好。我只是不喜欢绝对规则,因为似乎总是有例外。@ChrisBarrett-他们喜欢,但是!==只比较两个操作数,左边的一个和右边的一个。到那时!==发生了,未定义的| | | | | null已经出现了dy已求值,结果为null。我已将步骤添加到答案中。您不希望使用sumRng[I][2]!=undefined | | | | | | | | | | null,因为这只是sumRng[I][2]!=null。由于强制规则,对于null和undefined都是真的!=app
谎言,但不会是真的。如果,正如你在对问题的评论中所说,气体支持过滤器,你应该在你的回答中明确说明这一点。但请注意,您的答案与OP的代码不同;你的也过滤掉了其他几个falsy值,包括0,NaN,false…@TJ。根据Google Sheets将发送到数组的值,NaN不会发生。我将使用returne e[2]| e[2]==false | e[2]==0;以处理布尔值和0的情况。我还将直接在getValues上链接过滤器。非常感谢大家的帮助。但我还是有点困惑。我尝试了过滤代码,它的工作原理似乎与我的原始代码相同,因为我要推的数组仍然充满了大量的空条目,这很奇怪。我看不出它是如何进入IF语句的这一部分的。如果第3列中的值为false或0,那么您的语句将把它当作它的值不存在
var filteredArr =  sumRng.filter(function(e) {return e[2];})
sumRng.filter(function(e) {return e[2].toString();})
sumRng.filter(function(e) {return e[2] || e[2] === false || e[2] === 0;})
if(sumRng[i][2]){}