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

时间:2017-12-06 04:04:27

标签: 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();
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:1)

Specify the item to sort by,并使用{}代替[]作为对象表示法:

&#13;
&#13;
var custName = ["Smith, Al","Toms, Andy","Jones, Zack","Vargas, Eddie","Donner, Alice","McMullen, Jessie","Nevins, Carol","Stark, Howard","Neeland, Franny","Boxby, Amos"]
var mnthCharge = [140.00, 42.00, 18.00, 18.00, 36.00, 140.00, 42.00, 24.00, 140.00, 24.00]
var pastDueAmt = [0, 0, 84.00, 36.00, 0, 18.00, 42.00, 42.00, 96.00, 0]
var dayPastDue = [0, 0, 60, 60, 0, 30, 90, 30, 120, 0]

for(var d = [], i = 0; i < custName.length; ++i) 
    d.push({ Customer: custName[i], Recurring: mnthCharge[i], 
             Amount: pastDueAmt[i], Days: dayPastDue[i]       })   // {} instead of []

d.sort(function(a, b) { return (a = a.Customer) > (b = b.Customer) || -(a < b) })

console.log( JSON.stringify( d ).replace(/},/g, '},\n ') )
&#13;
&#13;
&#13;

答案 1 :(得分:0)

这是一种无需更改原始数据结构的方法。

假设您有两个长度相等的平行数组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中始终执行排序的方式:sort始终返回索引数组。

注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]));