我在数组上有一个过滤器的方法,其中有一个区域符号。然后,我想等于来自HTTP请求的结果。当结果为true时,它应该console.log("profile")
,为false时,应该返回console.log("rejected")
。但是无论结果如何,总会有console.log("profile")
.getProfile(id, token)
.then(data => {
let data = data.data;
let regions = ["SP", "RS", "PR", "MG", "SC"];
if (
regions.filter(reg => {
console.log(reg);
console.log(data.region === reg);
return reg === data.region; // it is false, because data.region is AC
})
) {
console.log("profile");
} else console.log("rejected");
})
所以..我想知道为什么reg === data.region
为假时我有console.log("profile)
。它应该被拒绝。错误提示在哪里?
答案 0 :(得分:3)
let regions = ["SP", "RS", "PR", "MG", "SC"];
let result = regions.filter(a => a === 'AC');
它将为您提供一个非falsy
值的空白数组
所以这就是为什么条件运行的原因...
您可以使用some()方法测试是否至少有一个元素 该数组通过了由提供的功能实现的测试。它 返回一个布尔值。
let regions = ["SP", "RS", "PR", "MG", "SC"];
let result = regions.some(a => a === 'AC');
// or you can use `includes`
let result1 = regions.includes('AC');
now result contain a boolean value
您可以这样做,我重构您的代码
.getProfile(id, token)
.then(data => {
let data = data.data;
let regions = ["SP", "RS", "PR", "MG", "SC"];
let result = regions.some(reg => reg === data.region); // it is false, because data.region is AC
if (result) {
console.log("profile");
} else {
}console.log("rejected");
})
答案 1 :(得分:1)
filter
方法返回数组,如果不匹配,则返回一个空数组。即使数组为空,它也会解释为true
答案 2 :(得分:1)
它归结为一个空数组,评估真实性
if([])
console.log("Empty arrays are truthy");
通过检查长度来固定
if([].length)
console.log("You wont see this.")
0
是错误的!
答案 3 :(得分:1)
您可以使用includes
方法:
if (regions.includes('AC')) {
}
或者您可以检查过滤后的数组的长度:
let length = regions.filter(reg => {
console.log(reg);
console.log(data.region === reg);
return reg === data.region;
}).length;
if (length) {
}
答案 4 :(得分:1)
除了其他答案外,如果您不需要使用过滤后的数组,而是要记录拒绝或配置文件,我将使用.some()
而不是.filter()
const regions = ["SP", "RS", "PR", "MG", "SC"];
const toFind = "foo";
if (regions.some(reg => {
console.log(reg);
console.log(toFind === reg);
return toFind === reg;}))
{
console.log("profile");
}
else
console.log("rejected");
答案 5 :(得分:0)
filter
将始终返回一个数组。在您的情况下,如果条件始终为真,因为空数组[]
是真。
如果没有匹配项,则将返回filter
而不是find
,而返回undefined
,这是错误的。
.getProfile(id, token)
.then(data => {
let data = data.data;
let regions = ["SP", "RS", "PR", "MG", "SC"];
if (
regions.find(reg => reg === data.region)
) {
console.log("profile");
} else console.log("rejected");
})