在JavaScript中处理多维数组

时间:2019-09-26 12:53:59

标签: javascript jquery performance multidimensional-array

让我的数组操作的最后一部分起作用使我发疯。 本质上我有:

var array1 = [
  ["2", "1007"],
  ["5", "1042"],
  ["3", "1076"],
]

我想要这个...

var array2 = [
  ["2", "1007", "1008"],
  ["5", "1042", "1043", "1044", "1045", "1046"],
  ["3", "1076", "1077", "1078"],
]

换句话说,我想使用每个子组的第一个元素作为计数器来驱动对第二个元素的连续添加。这是我坚持的后半部分,看不到为什么我的代码不起作用。小提琴将操作分解为简单的部分。这将用于大约12,000行,因此我想象我当前使用多个“ forEach”循环的方法并不是最快的。任何关于提高性能的想法(尽管仍请阅读)都将受到欢迎。

var array1 = [
  ["2", "1007"],
  ["5", "1042"],
  ["3", "1076"],
]

array2 = []
console.table(array1)

//--------

array1.forEach(e => {
  for (var counter = 0; counter < e[0]; counter++) {
    array2.push(e);
  }
});

console.table(array2);

//--------


var myCol2 = 1007
var mycounter = 0

array2.forEach(e => {

  if (e[1] == myCol2) {
    mycounter = mycounter + 1
    var myinteger = parseInt(e[1]) + mycounter // convert ref. to number
    myinteger = myinteger.toString(); // convert ref. back to string

    e[1] = myinteger
    myCol2 = e[1]
  }
  else
  {
    myCol2 = e[1]
    mycounter = 0
  }

});

console.table(array2);

提琴:https://jsfiddle.net/u2fwy6hc/

3 个答案:

答案 0 :(得分:3)

您可以使用.forEach()而不是使用.map(),根据内部数组中提供的第一个值,将每个内部数组转换为自身的“扩展”版本,如下所示:

const arr = [
  ["2", "1007"],
  ["5", "1042"],
  ["3", "1076"],
];

const res = arr.map(([r, start]) => { // use destructuring to get the first and second element of your inner array
  const ret = []; // create a temp array to hold our "consecutive" integers
  for(let i = +start; i<+start + +r; i++) // create a loop, to loop through our number range (where `i` represents a given number in the range
    ret.push(''+i); // add the number to the temp array (as a string ''+)
  return [r, ret]; // return he new array to take the place of the inner array
});

console.log(res);

答案 1 :(得分:2)

要获得更紧凑的版本,可以使用Array.reduce()和一些ES6扩展:

const arr2 = array1.reduce((acc,[count,start])=>{
   const vals = [...Array(+count).keys()].map(val=>`${+start+val}`)
   return [...acc, [`${count}`,...vals]]
 },[])

甚至可以单线完成:

var arr2 = array1.reduce((acc, [count, start])=> [...acc, [`${count}`,...[...Array(+count).keys()].map(val=>`${+start+val}`)]]
,[])

编辑:反思时,Array.map()更好:

var arr2 = array1.map(([count, start])=> [count, ...[...Array(+count).keys()].map(val=>`${+start + +val}`)])

答案 2 :(得分:0)

您可以迭代数组并获取内部数组并填充它,直到达到所需的计数为止。

function fill(array) {
    for (let a of array) {
        let [i, v] = a;
        while (--i) a.push((++v).toString());
    }
}

var array1 = [
  ["2", "1007"],
  ["5", "1042"],
  ["3", "1076"],
];

fill(array1);

console.log(array1);