使用Javascript基于另一个数组对齐数组

问题描述 投票:0回答:1

给定Header数组并使所有其他数组成为相同格式的header数组:

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;
  }
javascript arrays string algorithm data-structures
1个回答
1
投票

一种方法是将第一个输入数组视为队列,只要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)));
© www.soinside.com 2019 - 2024. All rights reserved.