javascript过滤器方法未返回任何结果

时间:2019-11-27 15:41:40

标签: javascript arrays

我在数组上有一个过滤器的方法,其中有一个区域符号。然后,我想等于来自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");
    })

所以在控制台中,我的结果是: enter image description here

所以..我想知道为什么reg === data.region为假时我有console.log("profile)。它应该被拒绝。错误提示在哪里?

6 个答案:

答案 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");
})