【问题标题】:JS: Loop with multiple conditionsJS:具有多个条件的循环
【发布时间】:2021-12-28 11:03:13
【问题描述】:

我有一组对象(汽车),我想从中只显示“竞争”的汽车。

const cars = [
  {
    name: "red",
    competes: true,
    category: 1
  },
  {
   name: "blue",
   competes: false,
   category: 1
  },
  {
    name: "green",
    competes: true,
     category: 2
  },
  {
    name: "yellow",
    competes: true,
    category: 3
  }
]

但是从那些竞争的汽车中,我只想展示那些属于第一类的汽车,用 for 循环就可以了。

对象现在是静态的,但由于我想在第二个时刻更改它们,我需要一个代码来检查汽车是否竞争,然后检查“类别”中是否有汽车。

  • 如果有属于“1 类”的汽车,请列出它们
  • 如果“类别”1 中没有汽车,请列出“类别”2(但不是 3)中的汽车
  • 等等

我的尝试是在一个循环中使用一个循环,由于它多次显示所有内容,所以有点不起作用

for (let i = 0; i < cars.length; i++) {
  if (cars[i].competes === false) continue;
  
  for (let f = 0; f < cars.length; f++) {
  if (cars[f].category > 1) break;
  console.log(`Cat1: ${cars[f].name}`);
}
}

如果“汽车”中的“类别”属性例如全部为 2 个或更多,如何解决此问题?

const cars = [
  {
    name: "red",
    competes: true,
    category: 2
  },
  {
   name: "blue",
   competes: false,
   category: 2
  },
  {
    name: "green",
    competes: true,
     category: 3
  },
  {
    name: "yellow",
    competes: true,
    category: 4
  }
]

【问题讨论】:

  • 可能先按category对数据进行排序。

标签: javascript arrays loops sorting if-statement


【解决方案1】:

首先你根据类别对数组进行排序,然后过滤出一个包含要竞争的汽车的数组

const cars = [
    {
        name: "red",
        competes: true,
        category: 1
    },
    {
        name: "blue",
        competes: false,
        category: 1
    },
    {
        name: "green",
        competes: true,
        category: 2
    },
    {
        name: "yellow",
        competes: true,
        category: 3
    }
]
const sorted = cars.sort((a, b) => a.category - b.category);
const compete = sorted.filter(x => x.competes && x.category == sorted[0].category);
console.log(compete[0]);

【讨论】:

    【解决方案2】:

    这是一个简单的排序和过滤解决方案

    const cars = [
      {
        name: "red",
        competes: true,
        category: 1
      },
      {
       name: "blue",
       competes: false,
       category: 1
      },
      {
        name: "green",
        competes: true,
         category: 2
      },
      {
        name: "yellow",
        competes: true,
        category: 3
      }
    ]
    
    let result = cars.sort((a,b) => a.category - b.category)
                     .filter(car => car.competes && (cars.length && car.category == cars[0].category))
    
    console.log(result)

    【讨论】:

    • 效果很好,谢谢!如果我记录“结果”,它会正确显示。我怎么能只显示结果汽车的名称呢?
    • 您可以遍历结果并显示名称在您需要的地方显示名称
    【解决方案3】:

    我们可以通过使用 Math.min() 和 Array.filter() 来获得最低竞争类别来获得“竞争类别”

    然后我们可以通过使用Array.filter() 只返回具有真实值且也属于竞争类别的competes 值的汽车来获取所有竞争汽车。

        
    const cars = [ { name: "red", competes: true, category: 1 }, { name: "blue", competes: false, category: 1 }, { name: "green", competes: true, category: 2 }, { name: "yellow", competes: true, category: 3 } ]
    
    // Only this category is competing.. 
    const competingCategory = Math.min(...cars.filter(car => car.competes).map(({category}) => category));
    const competingCars = cars.filter(car => car.competes && car.category === competingCategory);
    
    console.log('Competing cars:', competingCars)
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    此示例仅存在类别 2 和 3:

        
    const cars = [ { name: "blue", competes: true, category: 2 }, { name: "green", competes: true, category: 2 }, { name: "yellow", competes: true, category: 3 } ]
    
    // Only this category is competing.. 
    const competingCategory = Math.min(...cars.filter(car => car.competes).map(({category}) => category));
    const competingCars = cars.filter(car => car.competes && car.category === competingCategory);
    
    console.log('Competing cars (example II):', competingCars)
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      猜你喜欢
      • 2019-07-07
      • 1970-01-01
      • 2023-01-29
      • 2020-08-21
      • 2017-05-03
      • 1970-01-01
      • 2023-01-03
      • 1970-01-01
      • 2011-10-06
      相关资源
      最近更新 更多