Javascript关联数组不将子数组作为值

时间:2019-01-26 10:59:09

标签: javascript jquery arrays json associative-array

我有此代码用于可排序的布局管理。我正在尝试获取可排序stop()之后的每个div的位置。现在,我可以将数组中的所有内容放置到位,但是数组计数似乎为0,并且数据没有发送到另一页。

    console.clear();
    finalArr = [];
    $(".rowSortable").each(function(){
      nowRow = $(this).attr('class').substr(4,5);
      finalArr[nowRow] = [];
      $(this).find(".connectedSortable").each(function(){
        nowCol = $(this).attr('class');
        nowCol = nowCol.substr(0,nowCol.indexOf(" connectedSortable"));
        finalArr[nowRow][nowCol] = [];
        $(this).find(".sortable").each(function(){
          finalArr[nowRow][nowCol].push($(this).data("field"));
        });
      });
    });
    console.log(finalArr);
    console.log(JSON.stringify(finalArr));

console.log(finalArr);

home:1094
[row_1: Array(0), row_2: Array(0)]
    row_1: Array(0)
        col-md-12: Array(1)
            0: "Dog"
            length: 1
            __proto__: Array(0)
        length: 0
        __proto__: Array(0)
    row_2: Array(0)
        col-md-5: Array(3)
            0: "Cat"
            1: "Tiger"
            2: "Rat"
            length: 3
            __proto__: Array(0)
        col-md-7 left-column: Array(2)
            0: "Lion"
            1: "elephant"
            length: 2
        __proto__: Array(0)
        length: 0
    __proto__: Array(0)
    length: 0
__proto__: Array(0)

对于console.log(JSON.stringify(finalArr));

home:1095 []

我还尝试通过ajax将finalArr发送到PHP页面,这表明有一个空数组正在发布到该页面上

1 个答案:

答案 0 :(得分:1)

问题是您使用数组作为 map ,数组不适合此操作。在JS中,数组是一种特殊的对象类型,具有自己的一组方法,所有内容都假定它由整数属性键和一个length属性组成,该属性指定数组包含多少个项目。

通过设置数组的非整数属性,其length属性不会更改,因此,数组最终以length == 0结尾。这就是JSON.stringify()方法的结果,它看到数组的length为零,这就是为什么您在JSON中得到一个空数组的原因。

  • 普通对象在这种情况下更适合,因为它们的属性是任意的,并且JSON.stringify()可以正确处理它。换句话说,您的finalArr属性应该是普通对象,因此请将finalArr = []更改为finalArr = {}
  • 在每个上,都有,它们也是非整数属性,因此在这里还需要一个普通对象,因此更改{{1} }放入finalArr[nowRow] = []
  • 然后在每一列中,您实际上确实正确地使用了一个数组,因为您实际上是在向其推入,所以finalArr[nowRow] = {}就可以了。

我希望这有助于解释和解决您的问题。

P.S。您应该将finalArr[nowRow][nowCol] = []放在var声明的前面。省略时,实际上是在将finalArr对象作为属性添加到finalArr对象上。这是一种不好的做法,并且可能导致难以解决的错误。 windownowRow的声明也是如此。