Javascript 正在尝试选择“链过滤器”选项

Javascript 正在尝试选择“链过滤器”选项,javascript,select-options,Javascript,Select Options,我想链接我的两个过滤器,将一个特定的过滤器连接到我的google地图过滤器,如果按类别的过滤器标记已获得值,我希望按会话的过滤器从按类别的过滤器中获得值,然后与按会话的过滤器结合 这是我的代码,按类别和会话筛选: // filter markers by category filterMarkers = function (category) { for (i = 0; i < gmarkers1.length; i++) { marker = gma

我想链接我的两个过滤器,将一个特定的过滤器连接到我的google地图过滤器,如果按类别的过滤器标记已获得值,我希望按会话的过滤器从按类别的过滤器中获得值,然后与按会话的过滤器结合

这是我的代码,按类别和会话筛选:

 // 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);
          }
      }
  }
//按类别筛选标记
过滤器标记=功能(类别){
对于(i=0;i
这是我的选项选择代码以获取值:

  <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>
过滤方式:
商人的食物
星巴克
简单地
石林
关于尤文
普约
乐透
肯德基
蹦蹦跳跳
多米诺骨牌
圆圈K
查蒂姆
氟氯化碳
汉堡王
面包生活
巴克米总经理
安妮阿姨家
筛选依据:
会期
错误的
真的
如何链接两个过滤器

例如:如果我在“按类别筛选”中选择“星巴克”,在“按会话筛选”中选择“false”,我可以得到星巴克false session的值

提前感谢,


Kraken

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

1.声明筛选函数 顺便说一句,由于这些函数完全相同,只是更改了正在测试的属性,因此您可以将它们分解为:

var filterBy = function (name, object) {
  return function (marker) {
    return !object.length || marker[name] == object;
  }
};
2.使用过滤器 通过这种方式,您可以控制是链接过滤器还是仅使用其中一个过滤器

更新:更明确的用法定义 现在我们有了逻辑,我们想将这段代码连接到您的HTML

让我们将“2.使用过滤器”部分中的代码包装到函数中:

// 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 */
};



这应该是所有需要的。

你总是按2个条件过滤,而不是1。这就是为什么我在StackOverflow中请求。真的非常感谢你的帮助,你很好,但是因为我用你的代码替换了我的代码,这不起作用,真的很困惑。你是否用正确的
onchange
调用更新了你的HTML?我的意思是:“使用过滤器”部分应该包装在一个函数中,以便在表单更改时可以调用它-明白了吗?(因为在这里我理解“无效且无错误”中的“不工作”,对吗?)我写html选择这样,这是正确的?
filterByCategory
,根据我在代码中的注释,“返回要传递给Array.prototype.filter的筛选函数”。因此,不,这是不正确的。我将更新我的答案,以清楚地说明用法(注释中过于复杂),最多给我15分钟。编辑完成后,检查更新,如果你想玩的话,我用这个(丑陋的)测试了代码。然而,我不明白你在
gmarkers[]中有什么。session
:相关的
没有多大帮助,所以我的模型在这方面可能不是很好。但这可能是另一个故事!:P
// 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);
  });
// 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 */
};
<select id="selectcategory" onchange="setMarkersVisibility()">
<select id="selectsession" onchange="setMarkersVisibility()">