Выровнять массив на основе другого массива, используя Javascript - PullRequest
0 голосов
/ 10 марта 2019

Задать массив заголовков и преобразовать все остальные массивы в тот же формат массива заголовков:

HEADER     ["", "", "a", "b", "", "c", "d","",""]
1.           ["", "", "1", "2", "", "3", "4"]     ==== CORRECT FORMAT
2.           ["1","2","", "3", "4","",""]         ==== WRONG FORMAT
3.           ["", "", "", "", "1", "2", "", "3", "4"] = WRONG FORMAT

Output array :
1.           ["", "", "1", "2", "", "3", "4"]
2.           ["", "", "1", "2", "", "3", "4"]
3.           ["", "", "1", "2", "", "3", "4"]

Длина заголовка и входного массива одинакова. Но длина выходного массива должна быть до последнего элемента массива заголовка.

Я не могу исправить все типы входов с помощью приведенного ниже алгоритма:

  alignArray(arr1, arr2) {
    let arr3 = [];
    let arr4 = _.compact(arr2);
    let count = 0;
    _.map(arr1, function (num, index) {
      if (_.isString(num) && !(_.isEmpty(num))) {
        if (arr4[count])
          arr3.push(arr4[count]);
        else
          arr3.push("");
        count++;
      } else {
        arr3.push("");
      }
    });
    return arr3;
  }

1 Ответ

1 голос
/ 10 марта 2019

Один из подходов состоит в том, чтобы обрабатывать первый входной массив как очередь, удаляя элементы из очереди всякий раз, когда b имеет значение. Основываясь на вашем обновлении, я обрезал пустые строки в конце выходного массива.

const alignArray = (a, b) => {
  a = a.filter(e => e);
  b = b.map(e => e === "" ? e : a.shift() || "");
  let idx = b.length - 1;
  
  for (; idx >= 0 && b[idx] === ""; idx--);
    
  return b.slice(0, idx + 1);
};

const header = ["", "", "a", "b", "", "c", "d", "", ""];
const rows = [
  ["", "", "1", "2", "", "3", "4", "", ""],
  ["1","2","", "3", "4","",""],
  ["", "", "", "", "1", "2", "", "3", "4"]
];

rows.forEach(e => console.log(alignArray(e, header)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...