【问题标题】:Creating Multidimensional Key Value array javascript创建多维键值数组javascript
【发布时间】:2017-04-05 06:56:14
【问题描述】:

我有一个具有以下结构的数据表。

我想创建一个键值多维数组。即

main_array = {
  user_id  =  {
    'name' : 'XYZ',
    'email' : 'xyz@com'
  }

包含列的复选框类似于:

<input type="checkbox" name="id" value="3" data-name="xyz" data-email="xyz@com">

到目前为止我创建的脚本:

 var rows_selected = [];
 var $i = 0;    
 $("input:checked", rows).each(function(){
     var val = $(this).val();
    if($.inArray($(this).val(),rows_selected) == -1 ){
         rows_selected.push($(this).val());
         rows_selected[$i][val] = [];
         rows_selected[$i][val].push({'name':$(this).attr('data-name'),'email':$(this).attr('data-email')});
    }
    $i++;
 });

但是这个脚本总是抛出一个错误:Cannot read property 'push' of undefined

那么是否可以在 javascript 中创建一个键值对,将 user_id 作为键和名称、电子邮件数组作为其值推送到主结果数组中?我们也可以使用 javascript 拼接那个特定的键吗?

感谢任何帮助。谢谢

【问题讨论】:

  • 你没有数组 - 你有一个对象
  • ^^ ...其有效表达式将在user_id之后使用:,而不是=
  • @Weedoze 那么如何获得所需的输出?
  • @ArthParikh 您应该创建一个对象并分配值,而不是使用 push
  • 您的代码似乎与您说想要的结构无关,尤其是因为名称不同。 rows_selected 应该是 main_array 吗?为什么要尝试向字符串添加属性? (val 的结果是一个字符串;然后您尝试通过 rows_selected[$i][val] = []; 行上的赋值将属性添加到您刚刚作为字符串推送的条目中。)

标签: javascript jquery arrays multidimensional-array


【解决方案1】:

我不得不在这里猜测一下,但如果您的目标是拥有一个具有由$(this).val() 命名的属性的对象,其值是具有nameemail 属性的对象),那么:

var rows_selected = [];
$("input:checked", rows).each(function(){
    var $this = $(this);
    var entry = {};
    entry[$this.val()] = {
        name: $this.attr('data-name'),
        email: $this.attr('data-email')
    };
    rows_selected.push(entry);
});

我认为不需要 inArray 检查(并且无法理解您要使用它做什么)。

例子:

$("#btn").on("click", function() {
  var rows_selected = [];
  $("input:checked"/*, rows*/).each(function(){
      var $this = $(this);
      var entry = {};
      entry[$this.val()] = {
          name: $this.attr('data-name'),
          email: $this.attr('data-email')
      };
      rows_selected.push(entry);
  });
  console.log(rows_selected);
});
<div>
  <label>
    <input type="checkbox" value="one" data-name="name for one" data-email = "email for one">
    One
  </label>
</div>
<div>
  <label>
    <input type="checkbox" value="two" data-name="name for two" data-email = "email for two">
    Two
  </label>
</div>
<div>
  <label>
    <input type="checkbox" value="three" data-name="name for three" data-email = "email for three">
    Three
  </label>
</div>
<input type="button" id="btn" value="Click Me">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

但是,如果您不需要数组,只需要一个带有 $(this).val() 键的对象,它就更简单了——既可以构建,也可以稍后使用:

var rows_selected = {};
$("input:checked", rows).each(function(){
    var $this = $(this);
    rows_selected[$this.val()] = {
        name: $this.attr('data-name'),
        email: $this.attr('data-email')
    };
});

例子:

$("#btn").on("click", function() {
var rows_selected = {};
$("input:checked"/*, rows*/).each(function(){
  var $this = $(this);
  rows_selected[$this.val()] = {
     name: $this.attr('data-name'),
     email: $this.attr('data-email')
    };
  });
  console.log(rows_selected);
});
<div>
  <label>
    <input type="checkbox" value="one" data-name="name for one" data-email = "email for one">
    One
  </label>
</div>
<div>
  <label>
    <input type="checkbox" value="two" data-name="name for two" data-email = "email for two">
    Two
  </label>
</div>
<div>
  <label>
    <input type="checkbox" value="three" data-name="name for three" data-email = "email for three">
    Three
  </label>
</div>
<input type="button" id="btn" value="Click Me">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

【讨论】:

  • inArray 我曾经在全选/取消全选的复选框单击事件中避免 user_id 的重复条目。我尝试了您的代码,但输出的 $this.val() 未定义。
  • @ArthParikh:那么您并没有完全按照上述方式进行操作,因为当您调用它的 jQuery 对象中有一个元素时,val never 返回 undefined,就像$this.val() 一样(因为$this$(this))。
  • 我总是在最终数组中将值作为对象。
  • @ArthParikh:我不明白你的意思。如果您使用的是上述答案的数组版本,那么您当然是:我们将对象放入数组中。但这些对象具有有用的属性。
  • 这是我的输出:对象 {1:对象,2:对象}。在这里我无法获得 id 的值。
【解决方案2】:

我认为您需要一个对象数组,如下所示:

var rows_selected = [];
var $i = 0;
$("input:checked").each(function(){
    var val = $(this).val();
    var attrs = {'name':$(this).attr('data-name'),'email':$(this).attr('data-email')};
    rows_selected[$i++] = attrs;
 });
console.log(rows_selected);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="checkbox" name="id" value="1" data-name="xyz" data-email="xyz@com" checked="checked">
<input type="checkbox" name="id" value="2" data-name="abc" data-email="abc@com" checked="checked">
<input type="checkbox" name="id" value="3" data-name="jjj" data-email="jjj@com" checked="checked">

如果使用多维数组,比如:

rows_selected[$i][val] = [];

你可以得到一个包含“空”元素的数组,因为 JavaScript 中的数组是“有序的”,见下面的例子:

var test = [];

test[0] = "zero";
test[4] = "four";

console.log(test);

希望对你有帮助,再见。

【讨论】:

  • 不,它没有帮助再见。
  • 你也有倒置:rows_selected.push(val); rows_selected[$i][val] = []; rows_selected[$i][val] 在索引val 创建数组之前,您可以访问不存在的记录rows_selected[$i]
猜你喜欢
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 2018-06-17
  • 1970-01-01
相关资源
最近更新 更多