【问题标题】:How can I store multiple sets of input values in JS?如何在 JS 中存储多组输入值?
【发布时间】:2017-02-13 01:50:20
【问题描述】:

考虑以下输入对

<input type="text" class="item_name" value="iphone">
<input type="text" class="item_qty" value="10">

<input type="text" class="item_name" value="macbook">
<input type="text" class="item_qty" value="5">

页面上输入对的数量是动态的,而不是固定的。

我希望遍历所有对并将值存储为对,以便稍后输出到表中。

我一直在尝试使用 jQuery 的 each() 来实现,但我无法完全弄清楚。

  var detail = [];
  //var detail = {};

   $('input').each(function(index) {
      detail[index] = $(this).val();
      //detail.index = $(this).val();
   });

  console.log(detail);

这个输出

["iphone", "10", "macbook", "5"]

这不是我需要的。

我习惯了 PHP,那么在 JS/jQuery 中将输入对存储为多维关联数组/对象的正确方法是什么?

【问题讨论】:

  • 这与问题无关,但您的 input 元素缺少 name 属性。
  • @4castle 它们不属于表单,所以我认为没有理由使用它们

标签: javascript jquery arrays


【解决方案1】:

您可以使用类item_name 遍历元素并创建一个对象数组,每个对象都有一个nameqty 属性。

您可以使用 jQuery 的.map() 更轻松地创建这个数组:

var details = $('.item_name').map(function() {
  return {
    name: $(this).val(),
    qty: $(this).next('.item_qty').val()
  };
}).get();

console.log(details);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" class="item_name" value="iphone">
<input type="text" class="item_qty" value="10">

<input type="text" class="item_name" value="macbook">
<input type="text" class="item_qty" value="5">

【讨论】:

  • 如果我没有偶然发现你的答案,这就是我要发布的内容!
【解决方案2】:

javascript中关联数组的等价物是一个对象(都充当字典)

您遇到的问题是您的 html 将键和值描述为平面列表中的输入,因此当您使用 JQuery .each() 枚举它们时,您会将它们全部返回到一个列表中。

[key, value, key, value]

你最可能想要的是一个像这样的对象:

var obj = {
  key: value,
  key: value
}

然后你可以像这样说'macbook'属性

obj.macbookobj['macbook']

您可以通过一次循环两个列表并将它们添加到对象中来实现这一点,或者通过重构您的 html 以在另一个元素中同时包含键和值输入,例如

<div class="item">
 <input type="text" class="item_name" value="iphone">
 <input type="text" class="item_qty" value="10">
</div>
<div class="item">
 <input type="text" class="item_name" value="macbook">
 <input type="text" class="item_qty" value="5">
</div>

然后你可以这样做:

var items = {}
$('.item').each(function(){
 var key = $(this).find('.item_name').val()
 var value = $(this).find('.item_qty').val()
 items[key] = value;
})

【讨论】:

    【解决方案3】:

    var val = $("input.item_name").map(function(){
    obj = {}
    
    obj[$(this).val()] = $(this).next("input.item_qty").val();
    
    return obj;
    }).get()
    
    console.log(val)
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <input type="text" class="item_name" value="iphone">
    <input type="text" class="item_qty" value="10">
    
    <input type="text" class="item_name" value="macbook">
    <input type="text" class="item_qty" value="5">

    使用.map()

    【讨论】:

    • 对于这样的结构,可能更合理的是只输出一个带有许多键的对象,而不是一个对象数组,每个对象都有一个键。
    • 这很好。每个@4castle 的优缺点是什么?
    • @ProEvilz 数组允许重复元素,而对象要求每个键在对象中是唯一的。数组更容易使用,因为有许多内置的 utility functions 用于操作和迭代它们的内容。
    【解决方案4】:

    您可以使用递归,Array.prototype.slice() 在每次函数调用时对两个 &lt;input&gt; 元素进行切片,使用键值对填充对象,直到达到 &lt;input&gt; 元素 .length

    var [obj, n] = [{}, 2];
    var inputs = $("input[type=text]");
    var res = (function re(i) {
      if (i + n <= inputs.length) {
        var [key, prop] = Array.from(inputs).slice(i, i + n).map(({value}) => value)
        obj[key] = prop;
        i += n;
        return re(i)  
      } else {
        return obj
      }
    })(0);
    console.log(res)
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <input type="text" class="item_name" value="iphone">
    <input type="text" class="item_qty" value="10">
    
    <input type="text" class="item_name" value="macbook">
    <input type="text" class="item_qty" value="5">

    【讨论】:

    • 许多使用 jQuery 的人这样做是因为它的浏览器兼容性。这个答案使用了 ES6 中的几个特性,这些特性具有较低的浏览器兼容性,需要使用 Babel 之类的东西进行转译才能在旧浏览器上工作。
    • @4castle 答案是说明一种可能的模式,该模式可用于返回预期结果。您是否建议编辑答案以删除解构分配?当浏览器出现兼容性问题时,这里的第一印象是建议更新浏览器。
    • 我认为在答案中使用 ES6 特性是一种很好的做法,因为它可以教会人们新特性。我只是认为重要的是要说明如何使其适用于旧版浏览器。
    • @ProEvils 注意,Answer 中的解构赋值可以替换为 var obj = {}; var n = 2; Array.from()var arr = Array.prototype.slice.call(inputs, i, i + n).map(function(o) {return o.value}), var key = arr[0]; var prop = arr[1]
    【解决方案5】:

    您可以尝试一个快速而“肮脏”的解决方案:

    参考:for each input type get value with javascript

    .getElementById 的做法是正确的,但你想要的是 .getElementsByName

    var els = document.getElementsByName("filter[]");
    
    for (var i = 0; i < els.length; i++)
      alert(els[i].value);
    <input id="filter_15" type="checkbox" name="filter[]" value="15">
    <input id="filter_16" type="checkbox" name="filter[]" value="16">
    <input id="filter_17" type="checkbox" name="filter[]" value="17">

    或者,按照这个:jQuery .each() with input elements

    提取号码:

    var arrNumber = new Array();
    $('input[type=number]').each(function(){
        arrNumber.push($(this).val());
    })
    

    提取文本:

    var arrText= new Array();
    $('input[type=text]').each(function(){
        arrText.push($(this).val());
    })
    

    编辑:.map 实现

    var arrText= $('input[type=text]').map(function(){
        return this.value;
    }).get();
    

    【讨论】:

    • 哎呀!我复制了您的文字,但在我的评论中已损坏!
    • 我并不是专门寻找一种输出它们的方法,而是一种将它们存储在数组或对象中的方法,然后我可以将其输出。 detail.name 部分只是我希望如何编写它以更清楚地了解所需循环类型的一个示例
    • 我认为你需要创建一个对象来存储价值。所以你可以从数组中获取它并使用 obj.attribute..
    猜你喜欢
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2022-07-27
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    相关资源
    最近更新 更多