如何用JSON中的空元素表示数组?

时间:2015-06-02 00:38:19

标签: javascript arrays json sparse-matrix

我在JavaScript中有一个如下所示的数组:

var pattern = [ ["C5", 3], , , , , , , , ["C5", 3], , , ] 

我想将它存储在像这样的json文件中:

{
  "pattern": [
               ["C5", 3], , , , , , , , ["C5", 3], , ,
             ]
}

JSONLint告诉我:

Parse error on line 6:
...        ],        ,        ,        
---------------------^
Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '['

所以我理解我不能让逗号之间的空格为空。什么类似于空,但被JSON标准接受?

此模式文件是Javascript音乐跟踪器的一部分我正在制作类似于脉冲跟踪器,我希望json文件尽可能干净。

2 个答案:

答案 0 :(得分:4)

如果你想在JSON中有空格,你应该用null填充它。

示例:

var pattern = [ ["C5", 3], null, null, null, null, null, null, null, ["C5", 3], null, null, null, null, ...... ]

答案 1 :(得分:1)

如果您不想将null稀疏数组一起使用,则可以使用数组的对象表示。

 pattern = [["C5", 3], , , , , , , , ["C5", 3], , , ]

...将被一个索引值为属性的对象替换,另外还有一个length属性:

parse_array = {
    0: ["C5", 3],
    8: ["C5", 3],
    length: 12
}

可以使用reduce方法从数组生成此对象:

parse_array = pattern.reduce( ( obj, val, i ) =>
  {
    obj.length++
    if ( val )
      obj[i] = val
    return obj
  }, { length: 0 } )

然后使用简单的箭头函数将对象转换为JavaScript数组很容易:

pattern = Array.from( parse_array, v => v )

//Encode array

var pattern = [["C5",3],null,null,null,null,null,null,null,["C5",3],null,null,null]

out.innerHTML = JSON.stringify( pattern ) + "\n"

var parse1 = pattern.reduce( ( obj, val, i ) =>
  {
    obj.length++
    if ( val )
      obj[i] = val
    return obj
  }, { length } )

out.innerHTML += JSON.stringify( parse1 ) + "\n"


//Decode object

var parse2 = {
  0: ["C5", 3],
  8: ["C5", 3],
  length: 12
}

out.innerHTML += JSON.stringify( parse2 ) + "\n"

out.innerHTML += JSON.stringify( Array.from( parse2,  v => v ) )  + "\n"
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8" />
  <title></title>
</head>
<body>
	<h3>JSON array with empty items</h3>
	<pre id="out"></pre>
</body>
</html>