完全是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,所以我不清楚为什么会过去
如此愚蠢的歉意!
欢呼
答案 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中的多个值进行检查的方式。评估方式为:
sumRng[i][2]
被评估;让我们将结果值称为left
undefined || ''
,结果为''
;我们称之为temp
¹temp || null
('' || null
)被求值,结果为null
;我们称其为right
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
的计算方式如下:
a
||
操作的结果b
并得出||
操作的结果 undefined
是虚假,而不是真实。 ( falsy 值是用作布尔值时强制false
的任何值。falsy值为undefined
,null
,""
, 0
,NaN
,当然还有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;})
参考文献:
答案 3 :(得分:1)
我仍然为为什么原来的OR方法不起作用而感到困惑。实际上,我去了reddit尝试看看是否可以再进行澄清,但是仍然无法解决。但是我感谢您的所有尝试。
我确实得到了难题的替代解决方案,不过这似乎是我所使用方法的简化版本。就是这样(由用户insertAlias提供)
if(sumRng[i][2]){}
很明显,这只会说实话,因此似乎符合要求。但请指出任何不足之处