jQuery/JS 中的动态多维数组

Posted

技术标签:

【中文标题】jQuery/JS 中的动态多维数组【英文标题】:dynamic multidimensional array in jQuery/JS 【发布时间】:2020-09-07 03:11:59 【问题描述】:

我想在 jQuery/JS 中创建一个动态多维数组。但我无法让它工作:

var abc; // tried abc = [];

for (var i = 0; i < 3; i++) 
  $('#' + i).children().each(function() 
    abc[i][] = $(this).val(); // tried with abc[i].push(), abc[i][n] = ...
  );

预期结果:

Array (2)
0 Array (1)
0 ["abc", "abc", "abc", "abc", "abc", "abc"] (6)
1 Array (1)
0 ["abc", "abc", "abc", "abc", "abc", "abc"] (6)

有人可以给我提示吗?

ERROR: undefined is not an objectUnexpected token ']'

【问题讨论】:

abc 未定义。 undefined[i] 应该可以识别为一个问题。 abc[i][] 也不是您创建新子数组的方式。应该是abc[i] = somearray 您需要将abc 初始化为一个数组,正如您所尝试的那样,然后将该数组的每个元素也初始化为一个数组:abc[i] = [] @Taplar So abc[i] = [$(this).val()];? 可能是的。这在语法上是正确的。虽然你应该使用this.value 而不是$(this).val() 更像var abc=[]; for(i..) abc[i]=[]; children.each abc[i].push(this.value) 【参考方案1】:

在 jQuery/JS 中创建一个动态多维数组

创建基本数组,然后将第一个维度中的每一个初始化为一个新数组,以便将值推入第二个维度。

var arr = [];
for (var i = 0; i < 3; i++) 
  arr[i] = [];
  $('#div' + i).children().each(function() 
    arr[i].push(this.value);
  );

var arr = [];
for (var i = 0; i < 3; i++) 
  arr[i] = [];
  $('#div' + i).children().each(function() 
    arr[i].push(this.value);
  );

console.log(arr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='wrapper' id="div0">
      <input type='text' value="abc1-1">
      <input type='text' value="abc1-2">
      <input type='text' value="abc1-3">
      <input type='text' value="abc1-4">
      <input type='text' value="abc1-5">
    </div>
    <div class='wrapper' id="div1">
      <input type='text' value="abc2-1">
      <input type='text' value="abc2-2">
      <input type='text' value="abc2-3">
      <input type='text' value="abc2-4">
      <input type='text' value="abc2-5">
    </div>
    <div class='wrapper' id="div2">
      <input type='text' value="abc3-1">
      <input type='text' value="abc3-2">
      <input type='text' value="abc3-3">
      <input type='text' value="abc3-4">
      <input type='text' value="abc3-5">
    </div>

地图有什么解决办法

使用 jquery:

您可以使用 jquery .map 而不是循环遍历 .children.each

var arr = [];
for (var i = 0; i < 3; ++i) 
  arr.push($('#div' + i + ">*").map((i,e)=>e.value).toArray());

// start with an empty array
var arr = [];

for (var i = 0; i < 3; ++i) 
  arr.push($('#div' + i + ">*").map((i,e)=>e.value).toArray());

console.log(arr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="div0">
  <input type='text' value="abc1-1">
  <input type='text' value="abc1-2">
  <input type='text' value="abc1-3">
  <input type='text' value="abc1-4">
  <input type='text' value="abc1-5">
</div>
<div id="div1">
  <input type='text' value="abc2-1">
  <input type='text' value="abc2-2">
  <input type='text' value="abc2-3">
  <input type='text' value="abc2-4">
  <input type='text' value="abc2-5">
</div>
<div id="div2">
  <input type='text' value="abc3-1">
  <input type='text' value="abc3-2">
  <input type='text' value="abc3-3">
  <input type='text' value="abc3-4">
  <input type='text' value="abc3-5">
</div>

去除脆弱的硬编码 for 循环 0..3,您可以为每个“包装器”添加一个类(或使用 $("#0,#1,#2") 和每个在外部)

var arr = [];

$(".wrapper").each((i, e) =>
  arr.push($(e).find(">*").map((ii, ee) => ee.value).toArray())
);

var arr = [];

$(".wrapper").each((i, e) =>
  arr.push($(e).find(">*").map((ii, ee) => ee.value).toArray())
);
console.log(arr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='wrapper' id="div0">
  <input type='text' value="abc1-1">
  <input type='text' value="abc1-2">
  <input type='text' value="abc1-3">
  <input type='text' value="abc1-4">
  <input type='text' value="abc1-5">
</div>
<div class='wrapper' id="div1">
  <input type='text' value="abc2-1">
  <input type='text' value="abc2-2">
  <input type='text' value="abc2-3">
  <input type='text' value="abc2-4">
  <input type='text' value="abc2-5">
</div>
<div class='wrapper' id="div2">
  <input type='text' value="abc3-1">
  <input type='text' value="abc3-2">
  <input type='text' value="abc3-3">
  <input type='text' value="abc3-4">
  <input type='text' value="abc3-5">
</div>

扩展它,它看起来像你可以使用嵌套地图:

var arr = $(".wrapper").map((i, e) => $(e).find(">*").map((ii, ee) => ee.value).toArray()).toArray();

但是,正如您从 sn-p 中看到的那样,这会使最终数组变平。

var arr = $(".wrapper").map((i, e) => $(e).find(">*").map((ii, ee) => ee.value).toArray()).toArray();
console.log(arr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='wrapper' id="div0">
  <input type='text' value="abc1-1">
  <input type='text' value="abc1-2">
  <input type='text' value="abc1-3">
  <input type='text' value="abc1-4">
  <input type='text' value="abc1-5">
</div>
<div class='wrapper' id="div1">
  <input type='text' value="abc2-1">
  <input type='text' value="abc2-2">
  <input type='text' value="abc2-3">
  <input type='text' value="abc2-4">
  <input type='text' value="abc2-5">
</div>
<div class='wrapper' id="div2">
  <input type='text' value="abc3-1">
  <input type='text' value="abc3-2">
  <input type='text' value="abc3-3">
  <input type='text' value="abc3-4">
  <input type='text' value="abc3-5">
</div>

使用原生 javascript

现在还有一个可以使用的 Array.prototype.map 函数(“这些天” - 它已经存在了一段时间......但不是永远)。坚持使用 vanilla js 来获取 DOM 元素(见下文以使用 jquery 并转换为数组)以及一些 ES6 fancyness 从 htmlCollection 转换为数组提供了一个衬里:

var arr = [...document.getElementsByClassName("wrapper")].map((e)=>[...e.children].map((ee)=>ee.value))
console.log(arr);

[...document.getElementsByClassName("wrapper")] 这个位将 HTMLCollection 转换为数组,以便我们可以使用 js .map

var arr = [...document.getElementsByClassName("wrapper")].map((e)=>[...e.children].map((ee)=>ee.value))
console.log(arr);
<div class='wrapper' id="div0">
  <input type='text' value="abc1-1">
  <input type='text' value="abc1-2">
  <input type='text' value="abc1-3">
  <input type='text' value="abc1-4">
  <input type='text' value="abc1-5">
</div>
<div class='wrapper' id="div1">
  <input type='text' value="abc2-1">
  <input type='text' value="abc2-2">
  <input type='text' value="abc2-3">
  <input type='text' value="abc2-4">
  <input type='text' value="abc2-5">
</div>
<div class='wrapper' id="div2">
  <input type='text' value="abc3-1">
  <input type='text' value="abc3-2">
  <input type='text' value="abc3-3">
  <input type='text' value="abc3-4">
  <input type='text' value="abc3-5">
</div>

现在这使用了嵌套的 .map(js .map 不是 jquery .map)并且确实返回了预期的多维数组。

使用 jquery 选择器和 javascript 映射

最后,结合 jquery 选择器的简洁性(或者您可能已经将它们作为 jquery 对象,所以不想重新选择它们,任何理由都可以)与 js .map 以(稍微)更短的代码获得嵌套地图比原版:

var arr = $(".wrapper").toArray().map(e=>$(">*",e).toArray().map(ee=>ee.value));
console.log(arr);

这里:$(selector).toArray() 返回一个 DOM 元素数组,所以我们可以使用 js .map。

var arr = $(".wrapper").toArray().map(e=>$(">*",e).toArray().map(ee=>ee.value));
console.log(arr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='wrapper' id="div0">
  <input type='text' value="abc1-1">
  <input type='text' value="abc1-2">
  <input type='text' value="abc1-3">
  <input type='text' value="abc1-4">
  <input type='text' value="abc1-5">
</div>
<div class='wrapper' id="div1">
  <input type='text' value="abc2-1">
  <input type='text' value="abc2-2">
  <input type='text' value="abc2-3">
  <input type='text' value="abc2-4">
  <input type='text' value="abc2-5">
</div>
<div class='wrapper' id="div2">
  <input type='text' value="abc3-1">
  <input type='text' value="abc3-2">
  <input type='text' value="abc3-3">
  <input type='text' value="abc3-4">
  <input type='text' value="abc3-5">
</div>

【讨论】:

以上是关于jQuery/JS 中的动态多维数组的主要内容,如果未能解决你的问题,请参考以下文章

动态获取/设置多维数组中的值的函数

动态多维数组自行覆盖

填充临时数组以避免在动态多维数组上使用 Preserve

正确使用 memset 与动态分配的多维数组

Java基础 | 深入理解多维数组

动态多维数组c#