Javascript 映射函数不返回值
我尝试在map函数中返回一个值,然后在函数末尾达到默认返回值 我注意到map函数没有返回validateSequence函数的值,但是一个简单的for循环可以Javascript 映射函数不返回值,javascript,ecmascript-6,Javascript,Ecmascript 6,我尝试在map函数中返回一个值,然后在函数末尾达到默认返回值 我注意到map函数没有返回validateSequence函数的值,但是一个简单的for循环可以 function validateSequence(sequence) { const modifers = ['-', 'm', 'b', 'i']; sequence.map((seq) => { if(!modifers.includes(seq)) { return false; // wan
function validateSequence(sequence) {
const modifers = ['-', 'm', 'b', 'i'];
sequence.map((seq) => {
if(!modifers.includes(seq)) {
return false; // want to return false
};
});
return true;
};
validateSequence(['Z','e','p']); // returns true
函数验证序列(序列){
常量修改器=['-','m','b','i'];
for(设i=0;iMap返回false,对于序列
变量中的每个元素。因此,如果您返回该值,您将得到一个false元素数组:
function validateSequence(sequence) {
const modifers = ['-', 'm', 'b', 'i'];
return sequence.map((seq) => {
if(!modifers.includes(seq)) {
return false; // want to return false
};
});
};
调用validateSequence(['Z','e','p'])
将导致[false,false,false]
当然,如果您将map的结果存储在一个变量中,您可以对其进行求值,如果您愿意的话,可以确定all、some、any是否为false。这取决于您。这里:
sequence.map((seq) => {
if (!modifers.includes(seq)) {
return false;
};
});
您从(seq)=>{}
提供的回调返回false
,而不是validateSequence
函数本身。您不能从map
或forEach
方法中中断。因此,for
循环是一个更好的选择
您还可以检查序列中的项目是否存在于修改器中,如下所示:
函数验证序列(序列){
常量修改器=['-','m','b','i'];
返回序列.every(字母=>modifiers.includes(字母))
};
log(validateSequence(['Z','e','p']))
log(validateSequence(['m','i'])
这里有几个问题:
修饰符拼写错误为Modifier
您发布的两个示例不一样。在map()
版本中,您传入的回调用于返回一个新值,该值将在map()
函数的返回中出现。当您在该回调中返回false时,您不会退出validateSequence()
,您将从回调中返回(这会使映射的返回结果为false)
您可以在下面看到:
function validateSequence(sequence) {
const modifers = ['-', 'm', 'b', 'i'];
const test = sequence.map((seq) => {
if(!modifers.includes(seq)) {
return false; // want to return false
};
});
console.log(test); // [false, false, false], this is where your return false is going.
return true;
};
.map
创建一个新数组,其中包含对调用数组中的每个元素调用所提供函数的结果。它不能替代循环
实际上,您所做的是创建一个布尔值数组,但不存储它。因此,它会完成该任务,然后在底部返回true
如果希望在数组上迭代,请尝试使用.forEach
,或者使用.every
,这将简化逻辑:
function validateSequence(sequence) {
const modifers = ['-', 'm', 'b', 'i'];
return sequence.every(letter => modifers.includes(letter))
};
在最后的validateSequence
函数中,您有return true
,这就是为什么您总是得到true
。如果您想返回map
的结果,请将return
添加到该函数中
return sequence.map((seq) => {
if(!modifers.includes(seq)) {
return false; // want to return false
} else {
return true;
}
});
我不确定你想要的结果是什么,但是如果你想在某些条件通过时打破循环,那么这将不符合你的目的,因为map
总是返回一个值,它是一个一对一的映射。如果你想打破循环,你只需对循环执行。你可以这样做
function validateSequence(sequence) {
const modifers = ['-', 'm', 'b', 'i'];
const isMatch = sequence.some(seq => {
return modifers.includes(seq)
})
return isMatch
}
console.log(validateSequence(['Z', 'e', 'p']))
map函数正在返回seomething,但您没有对它执行任何操作。map迭代数组中的每个项,并从回调中生成一个新的返回值数组(在您的情况下,为false且未定义。除非回调抛出错误,否则它不会提前停止。它不是作业的正确工具;只需使用for循环即可。
function validateSequence(sequence) {
const modifers = ['-', 'm', 'b', 'i'];
const isMatch = sequence.some(seq => {
return modifers.includes(seq)
})
return isMatch
}
console.log(validateSequence(['Z', 'e', 'p']))