我正在尝试在map函数内部返回一个值,然后再在函数末尾达到默认返回值。
我注意到map函数没有为validateSequence函数返回值,而是一个简单的for循环可以。
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
function validateSequence(sequence) {
const modifers = ['-', 'm', 'b', 'i'];
for(let i=0; i<sequence.length; i++) {
if(!modifers.includes(sequence[i])) {
return false;
};
};
return true;
};
validateSequence(['Z','e','p']); // returns false
我希望map函数在达到默认返回值true之前返回false。我知道map函数是在达到默认返回值true之前执行的,为什么它不返回false?
答案 0 :(得分:2)
这里:
sequence.map((seq) => {
if (!modifers.includes(seq)) {
return false;
};
});
您是从false
提供的回调函数返回(seq) => {}
,而不是validateSequence
函数本身。您无法通过break
或map
方法使用forEach
。因此,for
循环是一个更好的选择。
您还可以像这样检查sequence
中的every
项目是否存在于modifers
中:
function validateSequence(sequence) {
const modifers = ['-', 'm', 'b', 'i'];
return sequence.every(letter => modifers.includes(letter))
};
console.log(validateSequence(['Z','e','p']))
console.log(validateSequence(['m', 'i']))
答案 1 :(得分:0)
对于sequence
变量中的每个元素,地图返回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的结果存储在一个变量中,则可以对它进行评估,以确定是否愿意,如果全部,部分或全部为假。这取决于你。
答案 2 :(得分:0)
这里有几个问题:
map()
版本中,您传递的回调用于返回新值,该新值将在map()
函数的返回中。当您在该回调中返回false时,您并没有从validateSequence()
中退出,而是从回调中返回(这将map
的返回结果中包含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;
};
答案 3 :(得分:0)
.map
创建一个新数组,其结果是在调用数组中的每个元素上调用提供的函数。它不能替代循环。
您实际上正在做的是创建一个布尔数组,但是无论如何都不存储它。这样便完成了该任务,然后完成了底部的returns true
。
如果您希望遍历数组,或者尝试使用.forEach
,请尝试使用.every
,这将简化您的逻辑:
function validateSequence(sequence) {
const modifers = ['-', 'm', 'b', 'i'];
return sequence.every(letter => modifers.includes(letter))
};
答案 4 :(得分:0)
在您的validateSequence
函数最后,您有return true
,这就是为什么您总是得到true
的原因。如果要返回map
的结果,请向其添加return
。
return sequence.map((seq) => {
if(!modifers.includes(seq)) {
return false; // want to return false
} else {
return true;
}
});
我不确定您想要的结果是什么,但是如果您希望在某些条件通过时中断循环,那么这将无法满足您的目的,因为map
总是返回一个值,它是一个单一映射。如果要中断循环,可以进行简单的for
循环。
答案 5 :(得分:0)
您可以这样做
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']))