【问题标题】:Trying to chain filter option select尝试链接过滤器选项选择
【发布时间】:2019-02-07 00:31:25
【问题描述】:

我想链接我的两个过滤器,以获取我的谷歌地图过滤器的特定过滤器,如果按类别的过滤器标记已获得值,我希望我的按会话过滤器从按类别过滤器中获取值,然后结合我的会话过滤器。

这是我的代码,按类别和会话过滤:

 // filter markers by category
  filterMarkers = function (category) {
      for (i = 0; i < gmarkers1.length; i++) {
          marker = gmarkers1[i];
          // If is same category or category not picked
          if (marker.category == category || category.length === 0) {
              marker.setVisible(true);

          }
          // categories don't match 
          else {
              marker.setVisible(false);
          }
      }
  }

  // filter markers by session
  filterMarkersx = function (session) {
      for (i = 0; i < gmarkers1.length; i++) {
          marker = gmarkers1[i];
          // If is same session or session not picked
          if (marker.session == session || session.length === 0) {

              marker.setVisible(true);


          }
          // session don't match 
          else {
              marker.setVisible(false);
          }
      }
  }

这是我的选项选择代码来获取价值:

  <div class="controls">Filter By :
    <select id="type" onchange="filterMarkers(this.value);">
   <option value="">Merchant Grub</option>
   <option value="STARBUCKS">STARBUCKS</option>
   <option value="SIMPLY">SIMPLY</option>
   <option value="SHIHLIN">SHIHLIN</option>
   <option value="RE JUVE">RE JUVE</option>
   <option value="PUYO">PUYO</option>
   <option value="LOTTERIA">LOTTERIA</option>
   <option value="KFC">KFC</option>
   <option value="HOP HOP">HOP HOP</option>
   <option value="DOMINOS">DOMINOS</option>
   <option value="CIRCLE K">CIRCLE K</option>
   <option value="CHATIME">CHATIME</option>
   <option value="CFC">CFC</option>
   <option value="BURGER KING">BURGER KING</option>
   <option value="BREADLIFE">BREADLIFE</option>
   <option value="BAKMI GM">BAKMI GM</option>
   <option value=" AUNTIE ANNE'S">AUNTIE ANNE'S</option>
    </select>
  </div>

    <div class="controls">Filter By :
    <select id="type" onchange="filterMarkersx(this.value);">
   <option value="">IN SESSION</option>
   <option value="false">FALSE</option>
    <option value="">TRUE</option>
    </select>
  </div>

如何链接两个过滤器?

例如:如果我在按类别过滤中选择了starbucks,而在按会话过滤中选择了false,则可以得到值starbucks false session。

提前致谢,

海妖

【问题讨论】:

  • 您总是按 2 个条件过滤,而不是 1 个。
  • 这就是我在stackoverflow中询问的原因

标签: javascript select-options


【解决方案1】:

对我来说,filterMarkersfilterMarkersx 这些函数并不是真正的“过滤器”,因为它们正在更改 gmarkers' 项目而不是返回此数组的子集。从过滤的角度来看,我会重写代码如:

1。声明过滤函数

// returns a filtering function to be passed to Array.prototype.filter parameterized with `category`
var filterByCategory = function (category) {
  return function (marker) {
    return !category.length || marker.category == category;
  }
};

// returns a filtering function to be passed to Array.prototype.filter parameterized with `session`
var filterBySession = function (session) {
  return function (marker) {
    return !session.length || marker.session == session;
  }
};

顺便说一句,由于这些是完全相同的函数,只是改变了被测试的属性,你可以将它们分解为:

var filterBy = function (name, object) {
  return function (marker) {
    return !object.length || marker[name] == object;
  }
};

2。使用过滤器

// set all visibility to false for starters
gmarkers.forEach(function (m) {
  m.setVisible(false);
});
// apply chained filtering then set visibility to true on resulting subset
gmarkers
  .filter(filterBy('category', category)) // or .filter(filterByCategory(category))
  .filter(filterBy('session', session)) // or .filter(filterBySession(session))
  .forEach(function (marker) {
    marker.setVisible(true);
  });

这样您可以控制是链接过滤器还是只使用其中一个。

更新:更清晰的用法定义

现在我们有了逻辑,我们想将这段代码连接到您的 HTML。

让我们将 "2. using the filters" 部分的代码封装在一个函数中:

// assuming vanilla JS: binding the function to `document`
// (the purpose is just to make it callable from the HTML)
document.setMarkersVisibility = function () {
  // first, fetch data from both <select> (category and session)
  var selectCategory = document.getElementById('selectcategory');
  var selectSession = document.getElementById('selectsession');
  var category = selectCategory.options[selectCategory.selectedIndex].value;
  var session = selectSession .options[selectSession .selectedIndex].value;
  /* INSERT PART 2. CODE HERE */
};

现在我们需要重构 HTML,因为您的两个 &lt;select&gt; 具有相同的 id 值,这是错误的。我们需要调用我们的新函数。鉴于上面的代码,我将它们命名为selectcategoryselectsession

<select id="selectcategory" onchange="setMarkersVisibility()">

<select id="selectsession" onchange="setMarkersVisibility()">

这应该是所有需要的。

【讨论】:

  • 非常感谢您的帮助,您很友善,但是由于我用您的代码替换了我的代码,所以这不起作用,真的很困惑
  • 您是否使用正确的onchange 调用更新了您的HTML?我的意思是:“使用过滤器”部分应该包装在一个函数中,以便在表单更改时可以调用它——你明白了,对吧? (因为这里我把“不工作”理解为“没有效果也没有错误”,对吧?)
  • 我这样写html选择
  • filterByCategory,根据我的代码内 cmets,“返回要传递给 Array.prototype.filter 的过滤函数”。因此,不,这是不正确的。我将更新我的答案以明确说明用法(评论太复杂),给我 15 分钟。
  • 完成编辑,检查更新,如果你想玩弄我用这个(丑陋的)JSFiddle 测试了代码。但是,我不明白你在gmarkers[].session 中的内容:相关的&lt;select&gt; 并没有多大帮助,所以我的模型可能不是很好。但这可能是另一个故事! :p
猜你喜欢
  • 2015-08-26
  • 2016-10-31
  • 2020-07-21
  • 2011-10-27
  • 2021-04-09
  • 1970-01-01
  • 2017-07-06
  • 2015-10-26
  • 2016-07-22
相关资源
最近更新 更多