javascript - 使用多个选择选项过滤数组

标签 javascript arrays function dom

我是 JavaScript 的初学者,我正在尝试使用下拉菜单过滤一系列车辆,第一个过滤器按品牌名称显示,然后第二个过滤器按车辆类型显示。 过滤器似乎工作得很好,但是当我选择一个品牌,然后选择一个类型时,它会显示使用类型过滤器的所有项目数组,并忽略品牌过滤器

数组:

const Data = [
  {
    brand: "Volkswagen",
    type: "Car",
    model: "Golf",
    year: "2019",
    price: "$12,000",
  },
  {
    brand: "Volkswagen",
    type: "Truck",
    model: "Tiguan",
    year: "2020",
    price: "$20,000",
  },
  {
    brand: "Mazda",
    type: "Car",
    model: "Mazda 3",
    year: "2022",
    price: "$32,000",
  },
  {
    brand: "Mazda",
    type: "Truck",
    model: "Mazda 6",
    year: "2021",
    price: "$29,000",
  },
  {
    brand: "Tesla",
    type: "Car",
    model: "Model S",
    year: "2023",
    price: "$42,000",
  },
  {
    brand: "Tesla",
    type: "Truck",
    model: "Model X",
    year: "2020",
    price: "$50,000",
  },
];

功能:

const getSelectedValue = () => {
  let brandSelection = document.getElementById("brandDropdown").value;
  let selection = document.getElementById("dropDownSelection");
  //   show all cars
  if (brandSelection === "All") {
    selection.innerHTML = "";
    Data.forEach((car) => {
      selection.innerHTML += `<div class="car">
            <h3>${car.brand}</h3>
            <p>${car.type}</p>
            <p>${car.model}</p>
            <p>${car.year}</p>
            <p>${car.price}</p>
        </div>`;
    });
  }
  //   show selected brand
  else {
    selection.innerHTML = "";
    Data.forEach((car) => {
      if (car.brand === brandSelection) {
        selection.innerHTML += `<div class="car">
                <h3>${car.brand}</h3>
                <p>${car.type}</p>
                <p>${car.model}</p>
                <p>${car.year}</p>
                <p>${car.price}</p>
            </div>`;
      }
    });
  }

  console.log(brandSelection);
};

// filter by type when brand is selected

const getSelectedType = () => {
  let typeSelection = document.getElementById("typeDropdown").value;
  let selection = document.getElementById("dropDownSelection");
  //   show all cars
  if (typeSelection === "All") {
    selection.innerHTML = "";
    Data.forEach((car) => {
      selection.innerHTML += `<div class="car">
                <h3>${car.brand}</h3>
                <p>${car.type}</p>
                <p>${car.model}</p>
                <p>${car.year}</p>
                <p>${car.price}</p>
            </div>`;
    });
  }
  //   show selected type
  else {
    selection.innerHTML = "";
    Data.forEach((car) => {
      if (car.type === typeSelection) {
        selection.innerHTML += `<div class="car">
                    <h3>${car.brand}</h3>
                    <p>${car.type}</p>
                    <p>${car.model}</p>
                    <p>${car.year}</p>
                    <p>${car.price}</p>
                </div>`;
      }
    });
  }

  console.log(typeSelection);
};

HTML:

<body>

    <div class="dropDown">
        <div class="Brand">
            <select name="" id="brandDropdown" onchange="getSelectedValue()">
                <option value="All">All</option>
                <option value="Volkswagen">Volkswagen</option>
                <option value="Mazda">Mazda</option>
                <option value="Tesla">Tesla</option>
            </select>
        </div>
        <div class="Type">
            <select name="" id="typeDropdown" onchange="getSelectedType()">
                <option value="">Type</option>
                <option value="All">All</option>
                <option value="Car">Car</option>
                <option value="Truck">Truck</option>
            </select>
        </div>
    </div>

    <div class="" id="dropDownSelection">

    </div>

</body>

最佳答案

也许你可以看一下这段代码

// JAVASCRIPT

....

const getSelected = () => {
  let typeSelection = document.getElementById('typeDropdown').value;
  let brandSelection = document.getElementById('brandDropdown').value;
  let selection = document.getElementById('dropDownSelection');
  // Show all cars
  if (brandSelection === 'All' && typeSelection === 'All') {
    selection.innerHTML = '';
    Data.forEach((car) => {
      selection.innerHTML += `<div class="car">
                <h3>${car.brand}</h3>
                <p>${car.type}</p>
                <p>${car.model}</p>
                <p>${car.year}</p>
                <p>${car.price}</p>
            </div>`;
    });
  }
  // Show selected brand
  else if (brandSelection !== 'All' && typeSelection === 'All') {
    selection.innerHTML = '';
    Data.filter((car) => car.brand === brandSelection).forEach((car) => {
      selection.innerHTML += `<div class="car">
                <h3>${car.brand}</h3>
                <p>${car.type}</p>
                <p>${car.model}</p>
                <p>${car.year}</p>
                <p>${car.price}</p>
            </div>`;
    });
  // Show selected type
  } else if (brandSelection === 'All' && typeSelection !== 'All') {
    selection.innerHTML = '';
    Data.filter((car) => car.type === typeSelection).forEach((car) => {
      selection.innerHTML += `<div class="car">
                <h3>${car.brand}</h3>
                <p>${car.type}</p>
                <p>${car.model}</p>
                <p>${car.year}</p>
                <p>${car.price}</p>
            </div>`;
    });
  // show selected brand and type
  } else {
    selection.innerHTML = '';
    Data.filter(
      (car) => car.brand === brandSelection && car.type === typeSelection,
    ).forEach((car) => {
      selection.innerHTML += `<div class="car">
                <h3>${car.brand}</h3>
                <p>${car.type}</p>
                <p>${car.model}</p>
                <p>${car.year}</p>
                <p>${car.price}</p>
            </div>`;
    });
  }
};

....
// HTML

....

<div class="dropDown">
  <div class="Brand">
    <select name="" id="brandDropdown" onchange="getSelected()">
      <option value="All">All</option>
      <option value="Volkswagen">Volkswagen</option>
      <option value="Mazda">Mazda</option>
      <option value="Tesla">Tesla</option>
    </select>
  </div>
  <div class="Type">
    <select name="" id="typeDropdown" onchange="getSelected()">
      <option value="">Type</option>
      <option value="All">All</option>
      <option value="Car">Car</option>
      <option value="Truck">Truck</option>
    </select>
  </div>
</div>

....

正如您所看到的,2 个下拉列表仅调用一个函数 getSelected(),这是因为如果您执行 2 个过滤器,则必须将它们彼此组合在一起,而不是分成 2 个函数。我希望这会有所帮助,谢谢

关于javascript - 使用多个选择选项过滤数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73229345/

相关文章:

javascript - href 里面的 mustache

c - 如何将返回的数组直接复制到另一个数组中?

java - 用于创建名称递增的对象的数组

function - 使用Arduino淡入多个LED

c++ - C++如何输出两组不同的随机数?

javascript - 如何在 Internet Explorer 中禁用复选框

javascript - 使用 localStorage 维护复选框的选中状态

javascript - 从 TypeScript 中的 lambda 表达式中检索属性名称

php - 如何使用foreach获取值

Mysql LEFT 匹配前 3 个字符