如何存储json下拉列表中的项目

Posted

技术标签:

【中文标题】如何存储json下拉列表中的项目【英文标题】:how to store items from a json dropdown list 【发布时间】:2021-04-12 19:31:30 【问题描述】:

我正在尝试从下拉列表中选择商店或验证多个项目,但我不知道该怎么做。 让我解释一下我想要做什么...... 我将食品质量放入 json 列表中

   <select id="locality-dropdown" name="locality" multiple="multiple" size="2">
    </select>

<script>
    var Food = //4 elements json format 
        [
           
              "name": "food1",
              "Glc": 2,
              "Lip": 0.2,
              "Prot": 0.5,
              "IG": 20
            ,
           
              "name": "food2",
               "Glc": 4,
              "Lip": 1.2,
              "Prot": 0.7,
              "IG": 40
           ,
           
              "name": "food3",
              "Glc": 5,
              "Lip": 0.32,
              "Prot": 0.76,
              "IG": 60
           ,
           
              "name": "food4",
               "Glc": 7.5,
              "Lip": 1.5,
              "Prot": 1.3,
              "IG": 80
                  
        ];

然后我把这个列表放在一个下拉格式中:

    let dropdown = document.getElementById('locality-dropdown');
    dropdown.length = 0;
    let defaultOption = document.createElement('option');
    defaultOption.text = 'Choose Food';
    
    dropdown.add(defaultOption);
    dropdown.selectedIndex = 0;
    
        let option;
        for (let i = 0; i<Food.length; i++) 
          option = document.createElement('option');
          option.text = Food[i].name;
          option.value0 = Food[i].Glc;
          option.value1 = Food[i].Lip;
          option.value2 = Food[i].Prot;
          option.value3 = Food[i].IG;
          console.log(option.value0,option.value1,option.value2,option.value3)
          dropdown.add(option);
</script>

那时我有一个不错的下拉列表框,里面有 food1 、 food2 、 food3 、 food4 。

瞧!现在该怎么办?!

我需要选择其中的一些,然后从这些选定的项目中,使用上面显示的列表中的数字来跟随我的数学运算,例如 Glc 的总和、Lip 的总和等。

我不知道我是否足够清楚,但是假设我选择了 food1 和 food3,那么因为我正在选择它们,所以稍后会在需要时返回:food1 的 Glc + food3 的 Glc ; food1 的唇 + food3 的唇等 - 如果选择了 3 个元素,则使用 3 个元素进行相同的处理。 我不知道如何编写代码以及使用哪种技术是否是其他 json 、所选元素的数组...?

【问题讨论】:

我想你会想要在select 元素的onchange 事件中添加一个eventListener。然后在您的事件侦听器回调函数中显示值,此 SO 帖子可能会为您提供所需的 - (***.com/questions/30372235/…) 【参考方案1】:

关于如何在选项值属性中存储与列表元素对应的单个数据元素,您有几个选择。

    使用数组索引。 将您的数据转换为以名称为关键字的对象并从中查找。 将数据转换为json并存储在value属性中。注意:此方法意味着如果您在构建下拉列表后更新了 Food 数组,那么您将不会在选项 value 属性中看到更新。如果需要更新个别属性,请勿使用此方法。

这里我已经使用 json 完成了。将其更改为其他两个是微不足道的。

<html>
    <body>
        <select id="locality-dropdown" name="locality" multiple="multiple">
        </select>
        <button id="locality-but">Submit</button>
    </body>

<script>
    "use strict"
    const Food = [
          "name": "food1",
          "Glc": 2,
          "Lip": 0.2,
          "Prot": 0.5,
          "IG": 20
        , 
          "name": "food2",
           "Glc": 4,
          "Lip": 1.2,
          "Prot": 0.7,
          "IG": 40
       , 
          "name": "food3",
          "Glc": 5,
          "Lip": 0.32,
          "Prot": 0.76,
          "IG": 60
       , 
          "name": "food4",
          "Glc": 7.5,
          "Lip": 1.5,
          "Prot": 1.3,
          "IG": 80
              
    ];

    const dropdown = document.getElementById('locality-dropdown');
    const defaultOption = document.createElement('option');
    defaultOption.text = 'Choose Food';
    defaultOption.disabled = true;
    
    dropdown.add(defaultOption);
    dropdown.selectedIndex = 0;
    
    document.getElementById('locality-but').addEventListener('click', (event) => 
        console.log('click');
        const dd = document.getElementById('locality-dropdown');
        const result = [];
        for(let i = 0; i < dd.options.length; i++) 
            const option = dd.options[i];
            
            if(option.selected) 
                result.push(JSON.parse(option.value));
                        
        
        console.log("do something with \n", result);
    )
    
    for (let food of Food) 
        const option = document.createElement('option');
        option.text = food.name;
        option.value = JSON.stringify(food);
        dropdown.add(option);
    
</script>
    
</html>

在事件侦听器的末尾,您有一个名为 result 的数组,其中包含所有选定选项的数据。您应该能够对其进行调整以满足您的需求。

【讨论】:

就是这样...谢谢!这非常接近我想做的事情,但我有一个哲学上的时间/动态问题。在您的解决方案中,似乎当我整合第一个选项时,我的数学将立即开始,但我希望首先拥有我选择的所有项目,然后开始我的数学;换句话说,验证我选择了什么......就像点击一个按钮说我对我选择的东西(1.2. 3 或 4 个元素)或复选框或两者都满意...... 好极了……完美!会很棒,但我不想坚持......如果你能告诉我如何将此下拉列表转换为下拉复选框。我查看了 Endothermic_Dragon 的链接,但它看起来很复杂,并且不适合您为我编写的代码。而这并不像''那么简单 这有点复杂。它显然不是标准组件,因此它涉及更多代码。您应该查看 bootstrap css 以查看是否符合要求。我发现this 看起来很简单。 glurps ...不适合我....我问这个问题是因为我使用phonegap将js代码放在手机上。问题是没有像电脑一样的 ctrl+click 来选择多个。所以我想到了一个复选框,但如果你有其他想法,欢迎。 毫无疑问,我们将为移动网络建立处理此问题的技术。听起来你对 js 或 css 不太了解,所以最好的办法是使用 bootstrap 之类的库来为你提供现成的组件。【参考方案2】:

尝试制作复选框列表而不是下拉列表:

var Food = //4 elements json format 
  [
      "name": "food1",
      "Glc": 2,
      "Lip": 0.2,
      "Prot": 0.5,
      "IG": 20
    ,
    
      "name": "food2",
      "Glc": 4,
      "Lip": 1.2,
      "Prot": 0.7,
      "IG": 40
    ,
    
      "name": "food3",
      "Glc": 5,
      "Lip": 0.32,
      "Prot": 0.76,
      "IG": 60
    ,
    
      "name": "food4",
      "Glc": 7.5,
      "Lip": 1.5,
      "Prot": 1.3,
      "IG": 80
    
  ];
for (var i=0;i<Food.length;i++)
CurrentFood=Food[i]
var input=document.createElement("input")
input.type="checkbox"
input.id=CurrentFood.name
var label=document.createElement("label")
label.for=CurrentFood.name
label.innerText=CurrentFood.name
document.body.appendChild(input)
document.body.appendChild(label)
document.body.appendChild(document.createElement("br"))

之后,将事件侦听器附加到每个复选框以侦听“更改”事件。 Checkbox Check Event Listener 之后,每当事件触发时,从被检查的那些的父级中找到索引,从列表中获取索引数组,并返回Food[index].GlcFood[index].Lip,或者任何你想要的。

【讨论】:

@Endothermic_Dragon 如果可能的话,我更喜欢复选框下拉菜单+如果可能的话,你能给我看看你说的代码(我现在很简单,但对我来说很难概念化)你的代码说,这听起来很有趣。 “复选框下拉菜单”是指这样的意思吗? ***.com/questions/19206919/… 谢谢,我真的很想使用检查列表下拉菜单,但它还必须与 Paul Rooney 写给我的代码兼容……我不确定我自己能不能做到;但我觉得它不应该那么难,尽管你给我的链接,我不清楚

以上是关于如何存储json下拉列表中的项目的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Classic ASP 的下拉列表中显示存储过程中的数据?

如何将数据绑定下拉列表中的选定项目置于会话状态?

后台封装成jsonarray,前台js如何接收并存储到下拉列表中,急急急。。。

如何检索存储在 select2 下拉列表中的数据?

如何从数组中动态设置下拉列表的值

禁用下拉列表项