从循环动态生成Javascript数组

从循环动态生成Javascript数组,javascript,jquery,multidimensional-array,Javascript,Jquery,Multidimensional Array,我知道这方面有很多问题,但我找不到解决问题的办法,我已经研究了一段时间了。我有两组名称相同的输入字段,一组用于产品代码,另一组用于产品名称。用户可以删除这些输入字段并将其添加到DOM中,这样就可以有多个: 到目前为止,我已经掌握了以下内容,尽管这会保存它,因此所有代码都在一个数组中,所有名称都在另一个数组中: var updatedContent = []; var varCode = {}; var varName = {}; $('.productVariationWrap.edit in

我知道这方面有很多问题,但我找不到解决问题的办法,我已经研究了一段时间了。我有两组名称相同的输入字段,一组用于产品代码,另一组用于产品名称。用户可以删除这些输入字段并将其添加到DOM中,这样就可以有多个:

到目前为止,我已经掌握了以下内容,尽管这会保存它,因此所有代码都在一个数组中,所有名称都在另一个数组中:

var updatedContent = [];
var varCode = {};
var varName = {};

$('.productVariationWrap.edit input[name="varVariationCode[]"]')
   .each(function(i, vali){
     varCode[i] = $(this).val();
   });

$('.productVariationWrap.edit input[name="varVariationName[]"]')
  .each(function(i1, vali1){
    varName[i1] = $(this).val();
  });

updatedContent.push(varCode);
updatedContent.push(varName);
我试图得到它,使名称和代码进入同一个数组。i、 e.代码是K=V对的密钥

基本上,我可以循环最后一个数组,并使代码和相关名称易于访问

我可以用PHP很容易地做到这一点,但在javascript中没有运气

编辑

我希望阵列看起来像:

[
    [code1, name1],
    [code2, name2],
    [code3, name3]
];

因此,在我可以执行一个循环之后,对于主数组中的每个数组,我可以使用键(例如code1)和相关值(例如name1)执行一些操作。这有意义吗?它有点像一个多维数组,尽管有些人可能会在谈到Javascript时反对该语句的有效性。

使用两个循环可能不是最佳选择。最好使用一个循环来收集所有项目,无论是代码还是名称,然后将它们组合在一起

另一个问题:我觉得你的选择器有点滑稽。您说过页面中可以有多个这样的控件,但是控件的名称重复是不正确的,除非它们是互斥的单选按钮/复选框——除非每对输入都位于其自己的祖先
?关于这一点的更多细节将帮助我提供更好的答案

注意:在代码中,您将varCode和varName变量实例化为对象
{}
,然后像数组
[]
一样使用它们。这是你的本意吗?当我第一次回答您时,我被“最终输出应该像这个数组一样”分散了注意力,没有注意到您需要对象中的key=value对。如果您的意思是说最终结果是嵌套数组,那么您可以对代码进行最小的修改,使其按原样工作,如下所示:

var updatedContent = [];

$('.productVariationWrap.edit input[name="varVariationCode[]"]')
   .each(function(i, vali){
      updatedContent[i] = [$(this).val()]; //make it an array
   });

$('.productVariationWrap.edit input[name="varVariationName[]"]')
   .each(function(i1, vali1){
      updatedContent[i1].push($(this).val()); //push 2nd value into the array
   });
{
    'code1': 'name1',
    'code2': 'name2',
    'code3': 'name3'
};
但是,由于您希望您的
code
成为
Name
值的唯一索引,因此我们需要使用对象而不是数组,使用
code
Name
值:

var updatedContent = {},
   w = $('.productVariationWrap.edit'),
   codes = w.find('input[name="varVariationCode[]"]'),
   names = w.find('input[name="varVariationName[]"]');

for (var i = codes.length - 1; i >= 0; i -= 1) {
   updatedContent[codes.get(i).val()] = names.get(i).val();
});
请注意,这将产生一个对象,符号如下所示:

var updatedContent = [];

$('.productVariationWrap.edit input[name="varVariationCode[]"]')
   .each(function(i, vali){
      updatedContent[i] = [$(this).val()]; //make it an array
   });

$('.productVariationWrap.edit input[name="varVariationName[]"]')
   .each(function(i1, vali1){
      updatedContent[i1].push($(this).val()); //push 2nd value into the array
   });
{
    'code1': 'name1',
    'code2': 'name2',
    'code3': 'name3'
};
现在,您可以像这样使用
updatedContent
对象:

var code;
for (code in updatedContent) {
    console.log(code, updatedContent[code]); //each code and name pair
}

最后,依赖
code
Name
输入以相同的顺序在单独的jQuery对象中返回似乎有点脆弱。某种确保您将正确的代码与正确的名称关联起来的方法对我来说似乎很重要——即使您现在这样做的方式正确,谁能说将来对页面布局的修订不会破坏什么呢?我只是喜欢显式关联,而不是依赖页面元素顺序,但您可能觉得不需要这样的保证。

使用两个循环可能不是最佳选择。最好使用一个循环来收集所有项目,无论是代码还是名称,然后将它们组合在一起

另一个问题:我觉得你的选择器有点滑稽。您说过页面中可以有多个这样的控件,但是控件的名称重复是不正确的,除非它们是互斥的单选按钮/复选框——除非每对输入都位于其自己的祖先
?关于这一点的更多细节将帮助我提供更好的答案

注意:在代码中,您将varCode和varName变量实例化为对象
{}
,然后像数组
[]
一样使用它们。这是你的本意吗?当我第一次回答您时,我被“最终输出应该像这个数组一样”分散了注意力,没有注意到您需要对象中的key=value对。如果您的意思是说最终结果是嵌套数组,那么您可以对代码进行最小的修改,使其按原样工作,如下所示:

var updatedContent = [];

$('.productVariationWrap.edit input[name="varVariationCode[]"]')
   .each(function(i, vali){
      updatedContent[i] = [$(this).val()]; //make it an array
   });

$('.productVariationWrap.edit input[name="varVariationName[]"]')
   .each(function(i1, vali1){
      updatedContent[i1].push($(this).val()); //push 2nd value into the array
   });
{
    'code1': 'name1',
    'code2': 'name2',
    'code3': 'name3'
};
但是,由于您希望您的
code
成为
Name
值的唯一索引,因此我们需要使用对象而不是数组,使用
code
Name
值:

var updatedContent = {},
   w = $('.productVariationWrap.edit'),
   codes = w.find('input[name="varVariationCode[]"]'),
   names = w.find('input[name="varVariationName[]"]');

for (var i = codes.length - 1; i >= 0; i -= 1) {
   updatedContent[codes.get(i).val()] = names.get(i).val();
});
请注意,这将产生一个对象,符号如下所示:

var updatedContent = [];

$('.productVariationWrap.edit input[name="varVariationCode[]"]')
   .each(function(i, vali){
      updatedContent[i] = [$(this).val()]; //make it an array
   });

$('.productVariationWrap.edit input[name="varVariationName[]"]')
   .each(function(i1, vali1){
      updatedContent[i1].push($(this).val()); //push 2nd value into the array
   });
{
    'code1': 'name1',
    'code2': 'name2',
    'code3': 'name3'
};
现在,您可以像这样使用
updatedContent
对象:

var code;
for (code in updatedContent) {
    console.log(code, updatedContent[code]); //each code and name pair
}

最后,依赖
code
Name
输入以相同的顺序在单独的jQuery对象中返回似乎有点脆弱。某种确保您将正确的代码与正确的名称关联起来的方法对我来说似乎很重要——即使您现在这样做的方式正确,谁能说将来对页面布局的修订不会破坏什么呢?我只是喜欢显式关联,而不是依赖页面元素顺序,但您可能不觉得有必要这样做。

我认为最好创建一个对象,这样您可以在以后访问键/值对,而不必循环(如果您不想:

var $codes = $('.productVariationWrap.edit input[name="varVariationCode[]"]'),
    $names = $('.productVariationWrap.edit input[name="varVariationName[]"]'),
    updatedContent = {};

for (var i = 0, il = $codes.length; i < il; i++) {
    updatedContent[$codes.get(i).value] = $names.get(i).value;
}

我认为,如果您不想:

var $codes = $('.productVariationWrap.edit input[name="varVariationCode[]"]'),
    $names = $('.productVariationWrap.edit input[name="varVariationName[]"]'),
    updatedContent = {};

for (var i = 0, il = $codes.length; i < il; i++) {
    updatedContent[$codes.get(i).value] = $names.get(i).value;
}

我不喜欢用两个循环来解决这个问题

 var updatedContent = [] 

 $('.productVariationWrap.edit').each(function(i, vali){
     var $this = $(this)
     , tuple = [$this.find('input[name="varVariationCode[]"]').val()
                , $this.find('input[name="varVariationName[]"]').val()]

     updatedContent.push(tuple)
 });

我不喜欢用两个循环来解决这个问题

 var updatedContent = [] 

 $('.productVariationWrap.edit').each(function(i, vali){
     var $this = $(this)
     , tuple = [$this.find('input[name="varVariationCode[]"]').val()
                , $this.find('input[name="varVariationName[]"]').val()]

     updatedContent.push(tuple)
 });

显示一个示例,说明您希望结果数组的外观听起来像是在查找字典而不是数组?确定添加了一个编辑。。。谢谢大家回答你的问题。请举例说明你希望结果数组的外观听起来像是在查找字典而不是数组?好的,添加了一个编辑。。。谢谢大家回答你们的问题。@JamesG有一个循环通过DOM no