2017-08-01 73 views
0

我一直在试图做一个函数,将不会返回任何值,如果两个值是两个数组之间相同。我在这里和谷歌上搜索了几个问题,我发现的一切都表明函数必须返回一个值,并且没有办法避免这样做。所以我直接问是否有办法,如果没有,我该如何解决我想要做的事情?JavaScript有一个函数返回没有值

var bannedValues = [2, 4, 6, 8]; //Even numbers 1-8 
 
var inputValues = [1, 2, 3, 4, 5, 6, 7, 8]; //All numbers 1-8 
 

 
var filterValues = function(value) 
 
{ 
 
    for (var number of bannedValues) 
 
    { 
 
    if (value == number) 
 
    { 
 
     return; //I want this to return absolutely nothing, not even an empty value 
 
    } 
 
    } 
 
    return value; 
 
} 
 

 
var filteredValues = inputValues.map(filterValues); 
 

 
console.log(filteredValues); 
 
/* The array just gains "undefined" values in the places I want there 
 
to be no value, so the array is a length of 8 instead of the 4 I want. 
 
Can I somehow take those out or can I just not have them there in the first place? */

+1

你有处理它返回undefined。 – epascarello

回答

1

如果您正在使用的地图,你实际上是通过您的数组迭代,如果操纵它必要的,但这不会从数组中删除项目。相反地​​图试试滤波器

var bannedValues = [2, 4, 6, 8]; //Even numbers 1-8 
var inputValues = [1, 2, 3, 4, 5, 6, 7, 8]; //All numbers 1-8 

var filterValues = function(value) { 
    return bannedValues.indexOf(value)===-1; 
} 

var filteredValues = inputValues.filter(filterValues); 

console.log(filteredValues); 

结果将是

(4) [1, 3, 5, 7] 
+1

array.filter中的回调应该返回true/false。 – James

+0

@詹姆斯你是对的,更新了答案。 –

0

JavaScript函数总是有返回值。对此你无能为力。

这是不可能的,我认为要区分明确返回undefined的函数和不带值表达式返回的函数之间的区别。

如果你想要做的事.map()但有跳过值的选项,使用.reduce()代替:

var filterValues = function(accumulator, value) 
{ 
    for (var number of bannedValues) 
    { 
    if (value == number) 
    { 
     return accumulator; 
    } 
    } 
    accumulator.push(value); 
    return accumulator; 
} 

var filteredValues = inputValues.reduce(filterValues, []); 
+0

我看了一个解释'.reduce()'的页面,并且从我读到的页面将它放到一个单独的值中,根据我对'.reduce()'的理解,我的例子并不清楚。你能澄清一些对JS比较陌生的人吗? https://www.w3schools.com/jsref/jsref_reduce.asp是我使用的页面,它说它只输出一个东西,而我只是想把它拿出来。 – JoshuaCF

+0

@JoshuaCF我的示例* does *只返回一个值,但该值是一个*数组*。基本上你可以使用'.reduce()'来实现'.map()',但它更加灵活。 '.map()'函数用于当您始终需要输入数组与结果数组之间的1对1关系时。用'.reduce()',你可以返回任何你想要的。在此示例中,只有在结果数组不是您的“禁用”值之一时,该值才会添加到结果数组中。因此结果数组可能比输入更短*,而'.map()'实际上不能这样做。 – Pointy

+0

这是有道理的,或者至少是你解释它的方式。实际的代码对我来说有点模糊,所以我没有意识到它返回一个数组作为它的值。无论哪种方式,'.filter()'似乎是更容易理解和使用的方法来做同样的事情你的答案,我宁愿使用一个简单的路线,而不是我无法理解的路线,如果我将来查看我的代码。感谢您解释它。 – JoshuaCF

1

使用Array.filter()方法:

var bannedValues = [2, 4, 6, 8]; //Even numbers 1-8 
var inputValues = [1, 2, 3, 4, 5, 6, 7, 8]; //All numbers 1-8 

filteredValues = inputValues.filter(function(el) { 
    return bannedValues.indexOf(el) < 0; 
}); 

/*This is another way to do it, but not supported in IE*/ 
filteredValues = inputValues.filter(function(el) { 
    return !bannedValues.includes(el); 
}); 

console.log(filteredValues); 

Lodash有这个问题,以及一个效用函数:see here

+0

Array.prototype.includes不支持IE和Android。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes –