Как я могу изменить длину каждой таблицы, чтобы она равнялась самой длинной, при условии, что самая длинная таблица имеет длину, большую или равную 5? - PullRequest
0 голосов
/ 10 ноября 2018

Давайте предположим, что у меня есть 2D-массив в машинописи.Точно в исходном коде это выглядит так:

    tsvData: any;
    this.tsvData = this.UploaderService.tsvData.split("\n").map(function(row){return row.split("\t");});

Я бы хотел изменить длину каждой таблицы, чтобы она равнялась самой длинной, при условии, что самая длинная таблица имеет длину, большую или равную 5Если длина самой длинной таблицы меньше 5, я бы хотел изменить длину каждой таблицы на 5. Я хотел бы заполнить недостающие места пустой строкой.Я добавляю два примера, чтобы понять, какова моя цель.Кроме того, я хотел бы удалить все массивы с пустыми строками.

Пример 1

В этом примере самый длинный массив равен 4, поэтому я изменяю длинукаждая таблица до 5.

Вход:

[["text1", "text2", "text3", "text4"], 
["text5", "text6"], 
["text7"],
["text8", "text9", "text10"],
[""]]

Выход:

[["text1", "text2", "text3", "text4", ""], 
["text5", "text6", "", "", ""], 
["text7", "", "", "", ""],
["text8", "text9", "text10", "", ""]]

Пример 2

В этом примересамый длинный массив равен 6, поэтому я изменяю длину каждой таблицы на 6.

Ввод:

[["text1", "text2", "text3", "text4"], 
["text5", "text6"], 
["text7"],
["text8", "text9", "text10", "text11", "text12", "text13"],
[""]]

Вывод:

[["text1", "text2", "text3", "text4", "", ""], 
["text5", "text6", "", "", "", ""], 
["text7", "", "", "", "", ""],
["text8", "text9", "text10", "text11", "text12", "text13"]]

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Давайте разберем его по шагам:

  1. Найти максимальную длину в массивах 2D-массива.
  2. Проверьте, если это >= 5. Исходя из этого, создайте maxLength.
  3. Затем переберите 2D-массив, создайте массив rest и заполните его "".
  4. Объединить массив остальных элементов с каждым элементом двумерного массива.

Попробуйте это:

var initialTime = performance.now();

var array1 = [
  ["text1", "text2", "text3", "text4"], 
  ["text5", "text6"], 
  ["text7"],
  ["text8", "text9", "text10"],
  [""]
];

var array2 = [
  ["text1", "text2", "text3", "text4"], 
  ["text5", "text6"], 
  ["text7"],
  ["text8", "text9", "text10", "text11", "text12", "text13"],
  [""]
];

function fillRestItems(arrays) {
  var maxArrayLength = Math
    .max(...arrays.map(array => array.length));

  var maxLength = maxArrayLength >= 5 ? maxArrayLength : 5;

  return arrays
  .map(arr => {
    if(!(arr.length === 1 && arr[0] === "")) {
      var addedArray = new Array(maxLength - arr.length).fill("");
      return [...arr, ...addedArray];
    }
  })
  .filter(array => array !== undefined);
}

console.log('Filled Array 1:', fillRestItems(array1));
console.log('Filled Array 2: ', fillRestItems(array2));

var finalTime = performance.now();
console.log(`This took: ${(finalTime - initialTime)} ms`);
0 голосов
/ 10 ноября 2018

Первым шагом будет поиск подмассива максимального размера.

let arr = [["text1", "text2", "text3", "text4"], 
            ["text5", "text6"], 
            ["text7"],
            ["text8", "text9", "text10"],
            [""]];

arr = arr.filter(e => e.every(x => x !== ""))    

const maxLength = Math.max(...arr.map(a => a.length));

Следующий шаг - заполнить массив пустыми значениями.

arr.forEach(e => {
    while(e.length < maxLength){
        e.push("");
    }
});

console.log(arr);

Я уверен, что есть лучшие способы сделать это, поскольку временная сложность алгоритма O (n2)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...