【问题标题】:Javascript dynamic checkbox values as arrayJavascript动态复选框值作为数组
【发布时间】:2020-07-13 11:18:47
【问题描述】:

我目前有一个包含车辆库存的 json 文件。我有一个搜索页面,允许用户使用复选框过滤库存,例如品牌、型号、颜色等。

我需要将复选框值作为数组传递。例如,如果我选择 Mustang 和 Camaro 复选框,则需要为 'Model' => ['Mustang', 'Camaro']

我尝试创建 2 个数组。一个用于键(品牌、型号、颜色)等……另一个用于每个值(Mustang 和 Camaro)。有些值可能只有一项,有些可能有几项。例如,如果我们想要所有红色 Mustang 和 Camaro,则数组应如下所示:

['Model' => ['Mustang', 'Camaro'],Color' => ['Red']];

或者,只是红色野马:

['Model' => ['Mustang'],Color' => ['Red']];

我可以循环每个复选框,并尝试将所有复选框名称 (data.id) 作为键,将第二个数组 (data.value) 作为值。如果键存在,则添加具有相同键的每个值。

var kv=[]; // Keys
var vv=[]; // Array of the values for each key.

$("[name='checkBoxItem']").each(function (index, data) {
   if (data.checked) {
          if(!(data.id in kv)){  // Is always called.
               alert("Does't exist, adding : " + data.value);
               kv.push(data.id);
               vv.push(data.value);
                  } else {
                    vv.push(data.value);
                  }
              checked.push({[kv]: vv});
            }
        });

我的代码返回:

Array ( [selected_values] => Array([0] => Array ([Make] => Array([0] => Mustang))))

很接近,但总是调用if(!(data.id in kv)),阻止我添加多项选择。

如果我让程序员阻止了我应该能够做的事情,我很抱歉。

【问题讨论】:

  • 对数组使用in 来检查数组中的元素是不正确的。 in 查找键和数组键与索引相同。 0 in [3]// true3 in [3]//false。试试if( !kv.includes(data.id))
  • 我尝试按照您的建议更改代码,但是使用: if( !kv.includes(data.id)) { kv.push(data.id); } 总是执行,即使 data.id 在下一次循环迭代中是相同的。再次感谢您的快速回复。关于应该如何完成,我可能还有另一个逻辑错误。感谢您的帮助。
  • 是的,这将解决 if() 正常工作。老实说,您正在为 $filters 混合 javascript 和 php 语法,并且不确定如何将其从 php 传递到 javascript
  • 抱歉,这是正确的。 if 工作正常。数组在第一次运行时总是空的,触发不存在警报。我需要以填充数组的方式生成数组,并识别过程中的重复键。如果存在重复键,则将另一个值添加到该数组。例如,添加 Model = Mustang,下一个出现的 Model,Model = Mustang,Camaro。
  • 非常有助于展示如何将 php 数组传递给 javascript

标签: javascript arrays checkbox


【解决方案1】:

由于您在示例中使用 jQuery,我认为使用它来检索实际数据值也不是问题,因此我将在示例中使用它:)

您可以在此处找到一个工作示例,其中有一堆复选框和一个用于收集复选框值的按钮。

$("#getvalues").on("click", function() {
  var result = {};
  $("input").each(function(index, el) {
    if (el.checked) {
      var id = $(el).data("id");
      var val = $(el).data("value");
      if (!result[id]) result[id] = [];
      result[id].push(val);
    }
  });
  console.log(result);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="checkbox" data-id="model" data-value="Camaro" >Camaro</input></br>
    <input type="checkbox" data-id="model" data-value="Mustang" >Mustang</input></br>
    Color</br>
    <input type="checkbox" data-id="color" data-value="Red" >Red</input></br>
    <input type="checkbox" data-id="color" data-value="Blue" >Blue</input></br>
    <input type="checkbox" data-id="color" data-value="Green" >Green</input></br>
    <button id="getvalues">
      GET SELECTED VALUES
    </button>

【讨论】:

  • 谢谢。这适用于 2 个定义的过滤器。唯一的问题是我们不知道他们会检查什么,所以我不能静态定义 Model 和 Color 数组。他们可以选择品牌和里程。或年份、颜色、手册和敞篷车。我是否循环 json 并创建该数组,而不是定义它?再次感谢。
  • @Mike 我已根据您的上次请求更新了代码 sn-p。希望对你有帮助
  • 确实如此。谢谢!
猜你喜欢
  • 2014-01-01
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 2012-10-29
  • 2011-08-14
  • 1970-01-01
相关资源
最近更新 更多