【问题标题】:Manipulating a multi-dimensional array in javascript在javascript中操作多维数组
【发布时间】:2020-01-26 18:13:59
【问题描述】:

让我的数组操作的最后一部分工作让我发疯。 基本上我有:

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/

【问题讨论】:

  • array1.map(([n, s]) =&gt; [n, ...Array(+n).fill().map((_, i) =&gt; `${+s + i}`)]); 但请注意,这不会满足您的“最快”要求,这只是一种有趣的方式:)

标签: javascript jquery performance multidimensional-array


【解决方案1】:

除了使用.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);

【讨论】:

  • 这很好,解释清楚,我可以理解。 “将每个内部数组转换为自身的“扩展”版本”正是我所坚持的。非常感谢您的帮助。
【解决方案2】:

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

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);

【讨论】:

    【解决方案3】:

    对于更紧凑的版本,您可以使用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}`)])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      • 2014-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多