在多维数组中拼接奇数/偶数,但结果显示一两个奇数/数

时间:2019-01-14 02:06:13

标签: javascript arrays for-loop matrix multidimensional-array

我试图拼接奇数/偶数,看起来像这样,我试图找到奇数,但是在结果数组上,偶数仍然存在,

function find(index){
for(var i = 0 ; i < index.length;i++) {
  for(var j = 0 ; j < index[i].length ; j++) {
    if(index[i][j] % 2 === 1) { // trying to find odd numbers
      index[i].splice(j, 1)
    } 
  }
}
return index
}

var data = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
]

var another = [
  [2, 2, 7],
  [1, 3, 5, 6],
  [1, 3, 5, 7, 9, 11]
]
console.log(find(data))
console.log(find(another))

我的代码有什么错误吗?还是我错过了什么? :)

1 个答案:

答案 0 :(得分:3)

问题在于,当您遍历数组时,您正在对其进行突变。

即。在第二个数组的第二行([1,3,5,6])上,请考虑发生了什么:

  • i = 1,j = 0
  • 数字(1)是奇数,因此您对其进行拼接,该数组现在看起来像[3,5,9]
  • i = 1,j = 1,数字为5,为奇数,因此将其删除。您跳过了3。
  • i = 1,j = 2,行的长度为2,因此循环结束。

我已经在您的代码中添加了一个控制台日志来演示这一点。

function find(index){
for(var i = 0 ; i < index.length;i++) {
  for(var j = 0 ; j < index[i].length ; j++) {
    if (i ===1) console.log(`i = ${i}, j=${j}, index[i]  = ${index[i]}, index[i].length=${index[i].length}`); 
    if(index[i][j] % 2 === 1) { // trying to find odd numbers
      index[i].splice(j, 1)
    } 
  }
}
return index
}

var another = [
  [2, 2, 7],
  [1, 3, 5, 6],
  [1, 3, 5, 7, 9, 11]
]
console.log(find(another))

因此,通常,通常不要循环遍历数组并对其进行突变。

相反,我建议尽可能使用Array.prototype methods而不是循环。

某些性能建议-您可以在此处使用过滤器。

function find(array){
    //Assuming array is a 2d array. 
    return array.map(row => row.filter(v => v%2 ===0)); 

}

var data = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
]

var another = [
  [2, 2, 7],
  [1, 3, 5, 6],
  [1, 3, 5, 7, 9, 11]
]
console.log(find(data))
console.log(find(another))

请注意,这确实会返回一些空数组,您可能想要保留这些空数组,或者可能想要再次进行过滤以删除空数组。

请注意,如果您不熟悉它-我在回答中使用ES6 fat arrow语法。