【问题标题】:How to create an array of sorted indexes of another array in typescript?如何在打字稿中创建另一个数组的排序索引数组?
【发布时间】:2021-03-11 08:15:54
【问题描述】:

我正在尝试从 typescript 中的另一个数组获取有序的索引数组。

让我举个例子:考虑一个函数,它接收一个任意大小的数组并返回另一个数组,其中包含输入的有序索引:

  • ex1:输入=(5.3, 2.4, 4.5, 6.2) > 输出=(1,2,0,3)。
  • ex2:输入=(10, 11, 5, 34, 3, 7, 17) > 输出=(4,2,5,0,1,6,3)。

我不能使用array.sort(),因为这会改变原始数组。

我被困住了,因为我对 JS 和 TS(生疏的 Delphi 程序员)的经验非常少。

提前感谢您的任何想法。

【问题讨论】:

    标签: javascript arrays typescript sorting


    【解决方案1】:

    使用slice() 创建一个副本,您可以在不改变原始数据的情况下进行排序,然后使用map() 创建一个数组,其中包含每个已排序元素在原始数组中的索引。

    const data = [5.3, 2.4, 4.5, 6.2],
          data2 = [10, 11, 5, 34, 3, 7, 17];
    
    const sortedIndex = (arr) => {
      return arr.slice().sort((a, b) => a - b).map(n => arr.indexOf(n))
    }
    
    console.log(JSON.stringify(sortedIndex(data)));
    console.log(JSON.stringify(sortedIndex(data2)));

    【讨论】:

    • 完美!谢谢。
    【解决方案2】:

    只需要两行代码即可:

    var unsortedArray = [6, 4, 9, 1, 5];
    var sortedArray = unsortedArray.slice().sort();
    
    console.log(sortedArray);      // [1, 4, 5, 6, 9]
    console.log(unsortedArray);    // [6, 4, 9, 1, 5]
    

    【讨论】:

      【解决方案3】:

      你可以复制数组然后对副本进行排序吗?

      var array0 = [4,2,5,7,1.6];
      var array1 = [];
      for(var i=0;i<array0.length;i++){
        array1.push(array0[i]);
      }
      array1.sort();
      //array0 = [4,2,5,6,1.6]
      //array1 = [1.6,2,4,5,6]
      

      【讨论】:

      • 这不会复制。尝试自己运行它。变量都是对同一个数组的引用
      • 仅当值小于 10 时。排序的默认值是转换为字符串,11 会在 2 之前
      • 谢谢。我认为在这种情况下,我会对输入数组进行排序,但不会将输入数组中的索引排序到新数组中!对于array0的这个ex.of我想得到:输出=(4,1,0,2,3)!我使用的数组只有数字!
      • 我的错,我以为他们只是想使用.sort() 方法而不是让它修改原始数组,只是误解了问题
      猜你喜欢
      • 2023-01-10
      • 2015-06-29
      • 2021-12-01
      • 2020-09-28
      • 1970-01-01
      • 2019-02-13
      • 2019-02-12
      • 2019-12-06
      • 1970-01-01
      相关资源
      最近更新 更多