javascript - 如何在 JavaScript 中对并行数组进行排序,同时保持索引相同

标签 javascript

我正在 javascript 类中处理一个项目,但在对并行数组进行排序时遇到问题。我已成功按字母顺序对它们进行排序,但是我还需要按升序排序。我尝试过使用键进行排序,但教授说我们不允许更改给定的数组。我需要能够对 mnthCharge 进行排序,但在排序时保持名称和其他数据一致。任何指点将不胜感激!

var custName = new Array("Smith, Al","Toms, Andy","Jones, Zack","Vargas, Eddie","Donner, Alice","McMullen, Jessie","Nevins, Carol","Stark, Howard","Neeland, Franny","Boxby, Amos");

  var mnthCharge = new Array(140.00, 42.00, 18.00, 18.00, 36.00, 140.00, 42.00, 24.00, 140.00, 24.00);

var pastDueAmt = new Array(0, 0, 84.00, 36.00, 0, 18.00, 42.00, 42.00, 96.00, 0);

  var dayPastDue = new Array(0, 0, 60, 60, 0, 30, 90, 30, 120, 0);
  
  function recurringCharges()
{
  var d = [];
for(var i=0; i<custName.length; i++){
  //d.push(['Customer': custName[i], 'Recurring': mnthCharge[i], 'Amount': pastDueAmt[i], 'Days': dayPastDue[i]]);
    d.push([custName[i], mnthCharge[i],pastDueAmt[i],dayPastDue[i]]);
}
var sorted = d.sort();

最佳答案

这是一种不需要改变原始数据结构的方法。

假设您有两个长度相等的并行数组 v 和 w。

首先,生成一个数值数组0...(v.length)-1;让我们称之为 ix:

var ix = v.map((x,i) => i);

然后对 ix 进行排序,而不是对 v 或 w 进行排序。当然,比较函数的设计必须考虑到它是对索引进行排序的事实;例如(假设 v 包含数值):

ix.sort((a,b)=>v[a] - v[b]);

现在 ix 为您提供了一个索引数组,您可以使用它们按排序顺序访问 v 和 w。

您可以做的一件事是重新排列 v 和 w,以便它们实际上已排序:

v = ix.map(x=>v[x]);
w = ix.map(x=>w[x]);

但你不需要这样做,你可以通过 ix 使用间接;例如:

for (let i = 0; i < ix.length; i++)
    alert(v[ix[i]] + " " + w[ix[i]]);

注释 1:这就是 APL 中排序的一贯工作方式:排序始终返回索引数组。

注 2:概念上更简单的生成 ix 的方法是:

var ix = [];
for (let i = 0; i < v.length; i++)
    ix.push(i);

注3:排序标准可以同时涉及v和w;例如,您可以按 v[i]+w[i] 的升序排序:

ix.sort((a,b)=>(v[a]+w[a]-v[b]-w[b]));

关于javascript - 如何在 JavaScript 中对并行数组进行排序,同时保持索引相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47666596/

相关文章:

javascript - Angular 构建数组

javascript - 为什么 jQueryeach() 函数中的全局变量会破坏我的翻转效果?

javascript - 如何两次选择同一个选项

javascript - 获取不在特定 div 中的所有表单输入

javascript - 当某些 promise 失败时如何继续 $q.all()

javascript - wavesurfer.js - 让它在 Firefox 以外的浏览器中工作

javascript - 使用关联数组中的键检索值

javascript - Polymer 1.x 铁 localstorage 奇怪的效果

javascript - 解析 date-fns 返回前一天的值

javascript - 使用 Javascript 向网页动态添加搜索框