为什么以下if语句排除了与其余数组相同的数组?

时间:2015-03-03 09:47:26

标签: javascript arrays regex

我有以下数组:

[ 'markdown',
  [ 'para', '"one"' ],
  [ 'hr' ],
  [ 'para', '"two"' ],
  [ 'para', '"three"' ] ]

我做了一个循环,只匹配那些带双引号的数组:

for (i = 1; i < jsonml.length; i++) {

      if (typeof jsonml[i][1] === "string" && jsonml[i][1].match(/"/g)) {
        var p = jsonml[i]
        console.log(p)
      }

      // more code

      if (jsonml[i][0] === 'hr') {
        var hr = jsonml[i]
        var p = jsonml[i + 1]

        hr.splice(0, 1, 'para', '* * *')
        p.splice(1, 0, {'class': 'noind'})
      }

出于某种原因,console.log(p)仅输出:

[ 'para', '"one"' ]
[ 'para', '"three"' ]

[ 'hr' ]是否会使[ 'para', '"two"' ]与if语句不匹配?如果是这样,如何修复它以便[ 'para', '"two"' ]匹配?

 if (jsonml[i][0] === 'hr') {
    var hr = jsonml[i]
    var p = jsonml[i + 1]

    hr.splice(0, 1, 'para', '* * *')
    p.splice(1, 0, {'class': 'noind'})
  }

修改

我认为问题在于下面的if语句,因为console.log(jsonml[i][1])输出:

"one"
undefined
{ class: 'noind' }
"three"

我认为if语句会按顺序执行吗?

1 个答案:

答案 0 :(得分:4)

问题似乎是因为您在迭代时修改数组。这意味着当你到达它时,[ 'para', '"two"' ]项目不再存在。

通常,在循环时,应始终避免修改集合。如果您需要进行更改,请在之前或之后进行更改(如果需要,也可以使用单独的循环)