【问题标题】:How to create a multidimensional array in Javascript and avoid duplicates?如何在 Javascript 中创建多维数组并避免重复?
【发布时间】:2017-03-26 02:32:05
【问题描述】:

我有以下 HTML:

<input type="text" name="inp1" id="inp1" />
<input type="text" name="inp2" id="inp2" />
<input type="text" name="inp3" id="inp3" />

<input type="submit" value="Send" id="clickMe" />

每次我点击提交按钮时,我都应该将每个 inp* 的值添加到一个数组中,所以我最终会得到这样的结果:

[
     ['inp1' => val1, 'inp2' => val2, 'inp3' => val3],
     ['inp1' => val10, 'inp2' => val20, 'inp3' => val30],
     ['inp1' => val11, 'inp2' => val21, 'inp3' => val31],
     ['inp1' => val12, 'inp2' => val22, 'inp3' => val32]
]

阅读this article后,我认为我可以做到以下几点:

var obj = {};
var item = [];

$('#clickMe').click(function() {
    item.push(
        $('#inp1').val(),
        $('#inp2').val(),
        $('#inp3').val()
    ); 
});

但是上面的解决方案最终会得到一个线性数组,而不是我想要的(例如 Fiddle 上的 here)。我已经阅读了here 和here,但我很困惑。

我也不应该有重复的元素,所以这个:

[
     ['inp1' => val1, 'inp2' => val2, 'inp3' => val3],
     ['inp1' => val1, 'inp2' => val2, 'inp3' => val3]
]

无效。那么,如何正确处理这个问题并获得一个多维数组呢?任何人都可以给我一些帮助并留下一个例子以便我得到这个吗?

编辑:建议代码应该与大多数浏览器兼容,而 IE 应该是 IE9+

【问题讨论】:

  • 问题是如何创建数组,如何避免重复,或者如何通过 Ajax 发送?你有什么代码?
  • @trincot 我正在编辑,现在看一下,简而言之:如何创建多维数组并避免重复

标签: javascript jquery arrays


【解决方案1】:

您可以维护一个Set,它比使用对象属性更适合此目的:

var list = new Set(); // helper object to avoid duplicates
var items = []; // the real 2D array

$('#clickMe').click(function() {
    var item = [
        $('#inp1').val(),
        $('#inp2').val(),
        $('#inp3').val()
    ];
    var key = JSON.stringify(item);
    if (list.has(key)) return; // skip
    list.add(key);
    items.push(item);
    return false; // to avoid that the form submits.
});

如果您有更多 input 元素,那么通过循环获取它们的值可能是值得的:

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

当需要支持旧版浏览器时

... 那么集合不是一个选项。改用普通对象:

var list = {}; // helper object to avoid duplicates
var items = []; // the real 2D array

$('#clickMe').click(function() {
    var item = [
        $('#inp1').val(),
        $('#inp2').val(),
        $('#inp3').val()
    ];
    var key = JSON.stringify(item);
    if (list[key] === 1) return; // skip
    list[key] = 1;
    items.push(item);
    return false; // to avoid that the form submits.
});

【讨论】:

  • 我喜欢这个,虽然我更新了我的Fiddle 并且不工作,但它很干净。我正在使用 Chrome,你能检查一下吗?
  • 您的小提琴没有任何其他代码可以对数组进行实际操作。
  • 我又有updated it了,看看(加了console.log())。有没有其他兼容旧IE的方式?可能 9 岁以上?
  • 你想支持IE9吗?在这种情况下,您不能使用 Sets。请在您的问题中提出该要求。然后我会更新我的答案(当问题中没有特别询问时,我不想给出旧代码作为答案 - 我希望你理解:))
  • 明白了忘了说兼容性,添加到OP中
【解决方案2】:

您可以尝试为每个键值对(输入字段的属性)包装一个 JavaScript 对象,然后将 push 每个对象包装到一个数组中。以下示例可能会有所帮助:

var item = [];
$('#clickMe').click(function() {
    var val1 = $('#inp1').val();
    var val2 = $('#inp2').val();
    var val3 = $('#inp3').val();
    var obj = {
        inp1: val1,
        inp2: val2,
        inp3: val3
      };
item.push(obj);
});
//your code for AJAX goes here

我希望这会有所帮助。

【讨论】:

    【解决方案3】:

    在 JavaScript 中没有关联数组的概念。您应该对对象进行水合,然后通过表单编码或 JSON 编码对象将其作为 XMLHttpRequest 发送。

    $('#clickMe').click(function() {
        var obj = {};
        obj[ $('#inp1').attr('name') ] = $('#inp1').val();
        obj[ $('#inp2').attr('name') ] = $('#inp2').val();
        obj[ $('#inp3').attr('name') ] = $('#inp3').val();
        console.log(obj) // see desired data-structure
        console.log(obj.inp1); // get inp1 val
        console.log(obj['inp1']); // get inp1 val again
    });
    

    如果您可以使用以下内容循环输入元素,则此示例也会更好:

    var elms = $('form input');
    var obj = {};
    for ( var i = 0; i < elms.length; i++ )
    {
        obj[ $(elms[i]).attr('name') ] = $(elms[i]).val();
    }
    

    【讨论】:

      【解决方案4】:

      要在 Javascript 中创建关联数组的等价物,您需要一个对象。对象属性的作用类似于 PHP 等语言中的数组键。例如:

      var myObject = {
          a: [1,2,3],
          b: [4,5,6],
          c: {
              cat:"Fluffy",
              dog:"Fido"
          }
      };
      

      这里属性a和b包含数组,属性c包含另一个对象。

      【讨论】:

        【解决方案5】:
        JSON.stringify(AssocArray);
        

        创建 Json 字符串以通过 AJAX 请求发送。

        或者做 $("form").serialize() 。要了解更多关于这种方法的信息,您可以查看http://api.jquery.com/serialize/

        【讨论】:

        • 我不知道如何从Javascript创建初始AssocArray
        • 你可以通过运行像 $("form").children("input").each(function(){ //建立一个关联数组 }); 这样的循环来做到这一点另一个简单的方法是 $("form").serialize();在此处查看文档和示例api.jquery.com/serialize
        • 我已经编辑了 OP,看看,这不是我要找的。有了数组后,我可以使用你的建议
        猜你喜欢
        • 1970-01-01
        • 2012-01-15
        • 2011-06-25
        • 2022-11-10
        • 2012-05-14
        • 1970-01-01
        • 2012-10-29
        • 2017-09-27
        • 1970-01-01
        相关资源
        最近更新 更多