Управление многомерным массивом в JavaScript - PullRequest
1 голос
/ 26 сентября 2019

Получение последней части моей работы с массивами сводит меня с ума.По сути, у меня есть:

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

Fiddle: https://jsfiddle.net/u2fwy6hc/

Ответы [ 3 ]

3 голосов
/ 26 сентября 2019

Вместо использования .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 голос
/ 26 сентября 2019

Для более компактной версии вы можете использовать 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}`)])
0 голосов
/ 26 сентября 2019

Вы можете перебрать массив, взять внутренний массив и заполнить его, пока не будет достигнут желаемый счет.

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...