【问题标题】:How can I change the length of each table to be equal to the longest one provided that the longest one has a length greater than or equal to 5?如果最长的表的长度大于或等于 5,如何将每个表的长度更改为等于最长的表?
【发布时间】:2019-04-13 17:46:00
【问题描述】:

假设我在打字稿中有一个二维数组。在源代码中是这样的:

    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"]]

【问题讨论】:

    标签: arrays angular typescript multidimensional-array angular6


    【解决方案1】:

    让我们把它分解成几个步骤:

    1. 求二维数组的最大长度。
    2. 检查是否为>= 5。在此基础上,创建一个maxLength
    3. 然后循环遍历二维数组,创建剩余数组并用"" 填充它。
    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`);

    【讨论】:

    • 这几乎是我想要实现的,但是在 [""] 的情况下它返回 ["", "", "", "", ""] 但它应该删除这个数组。
    • 谢谢,您的解决方案和 Sid 的解决方案都能完美运行。当然,我两个都投了,但我只能接受一个。在这种情况下,我必须选择性能更好的解决方案。你觉得哪一个更好?
    • 是的,我更新了问题。感谢您的帮助。
    • 我犯了一个错误。我没有检查表中最长数组短于 5 的情况。不幸的是,Sid 的解决方案不能正常工作。我接受你的解决方案。
    【解决方案2】:

    第一步是找到最大大小的子数组。

    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)

    【讨论】:

    • 这几乎是我想要实现的目标,但是在 [""] 的情况下它返回 ["", "", "", "", ""] 但它应该删除这个数组。
    • 谢谢,您的解决方案和 SiddAjmera 的解决方案都能完美运行。当然,我两个都投了,但我只能接受一个。在这种情况下,我必须选择性能更好的解决方案。你觉得哪个更好?
    • 先回答谁就去。 ;)
    • 我犯了一个错误。当表中最长的数组短于 5 时,我没有检查案例。在您的情况下,它不起作用。两种情况下的性能相似,因此根据您的建议,我接受 SiddAjmera 的解决方案。
    猜你喜欢
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 2022-09-30
    • 2021-05-22
    • 2019-10-13
    相关资源
    最近更新 更多