我遇到以下代码时出现问题:
var fileheader = ["GENE_NAME", "3", "4", "1", "2", "logFC", "logCPM", "PValue", "FDR"]
for (var j = 0; j < fileheader.length; j++) {
if (fileheader[j] !== ('GENE_NAME' || 'logCPM' || 'logFC' || 'FDR' || 'PValue')) {
console.log(fileheader[j])
}
}
我预计只会显示值“3”,“4”,“1”和“2”,但是它们都显示出来,我不明白为什么。
答案 0 :(得分:6)
尝试编写代码,
var fileheader = ["GENE_NAME", "3", "4", "1", "2", "logFC", "logCPM", "PValue", "FDR"];
var filter = ['GENE_NAME', 'logCPM', 'logFC', 'FDR', 'PValue'];
for (var j=0; j<fileheader.length; j++){
if (!filter.includes(fileheader[j])){
console.log(fileheader[j])
}
}
关于使用Array.prototype.includes()
,
这是ES6的新版本,它的浏览器支持有限。即使在最近的版本中,它也不支持IE。作为替代方案,您可以使用Array.prototype.indexOf()
。使用它将为您提供匹配元素的索引,如果没有匹配,则它将返回-1
。基于此,您可以修改您的代码。
现在让我们来解决代码中存在的问题,
看看下面的代码段,
('GENE_NAME'||'logCPM'||'logFC'||'FDR'||'PValue')
始终会评估为'GENE_NAME'
。所以你的代码非常相似,
var fileheader = ["GENE_NAME", "3", "4", "1", "2", "logFC", "logCPM", "PValue", "FDR"]
for (var j=0; j<fileheader.length; j++){
if (fileheader[j] !== 'GENE_NAME'){
console.log(fileheader[j])
}
}
答案 1 :(得分:6)
不幸的是,这不是||
运算符的工作方式。你必须写:
fileheader[j] !== 'GENE_NAME' || fileheader[j] !== 'logCPM' // ...etc
另一个选择是创建一个数组并使用indexOf
:
if (['GENE_NAME', 'logCPM', 'logFC', 'FOR', 'PValue'].indexOf(j) < 0) {
}
如果您只担心较新的浏览器,您也可以使用includes
代替indexOf
。
答案 2 :(得分:2)
如果您的目标是仅显示数字,则可以使用isNaN
:
var fileheader = ["GENE_NAME", "3", "4", "1", "2", "logFC", "logCPM", "PValue", "FDR"]
for (var j=0; j<fileheader.length; j++){
if (!isNaN(fileheader[j])){
console.log(fileheader[j])
}
}
答案 3 :(得分:0)
通常||
用于评估一系列条件,评估为真/假的表达式,某些值或无值,或类似场景。
你可以做很酷的事情,如果你用它来控制每个表达式返回值的执行顺序,因为它在第一次 评估之后停止到真强>
它被称为逻辑或,但它在JavaScript(EcmaScript)中返回不同的东西。显然是序列中的第一个String。 剩下的就足够了。除了第一个之外的所有人都是不平等的。
以下是解释:
逻辑运算符通常与布尔(逻辑)值一起使用; 当它们是时,它们返回一个布尔值。和&amp;&amp;和||运营商 实际上返回一个指定操作数的值,所以如果 这些运算符与非布尔值一起使用,它们可能返回一个 非布尔值。逻辑运算符在中描述 下表。
如果可以转换为true,则返回expr1 ;否则,返回 表达式2。