在javascript中使用其中一个数组的值对2数组进行排序

在javascript中使用其中一个数组的值对2数组进行排序,javascript,node.js,sorting,Javascript,Node.js,Sorting,假设我有两个数组 priceArray=[1,5,3,7] userIdArray=[11,52,41,5] 我需要对priceArray进行排序,这样userIdArray也将被排序。 例如,输出应为: priceArray=[1,3,5,7] userIdArray=[11,41,52,5] 有什么办法吗 我正在用NodeJS编写我的服务器在不了解整个用例的情况下,很难指定更好的解决方案。也就是说,如果您需要按ID对这些对象进行排序,那么创建包含用户对象的单个数组可能更有意义: var us

假设我有两个数组 priceArray=[1,5,3,7]

userIdArray=[11,52,41,5]

我需要对priceArray进行排序,这样userIdArray也将被排序。 例如,输出应为:

priceArray=[1,3,5,7] userIdArray=[11,41,52,5]

有什么办法吗


我正在用NodeJS编写我的服务器

在不了解整个用例的情况下,很难指定更好的解决方案。也就是说,如果您需要按ID对这些对象进行排序,那么创建包含用户对象的单个数组可能更有意义:

var users = [
  { id: 123, price: 25.00 },
  { id: 124, price: 50.00 }
];

users.sort(function(a, b) {
  return a.id - b.id;
});
或者,如果不需要对它们进行排序,您可以简单地按id创建用户地图:

var userPrices = {
  123: 25.00,
  124: 50.00
};
摘自并适应用户阵列:

//要排序的数组
var priceArray=[1,5,3,7],
userIdArray=[11,52,41,5];
//临时数组保存具有位置和排序值的对象
var mapped=priceArray.map(函数(el,i){
返回{index:i,value:el};
});
//对包含缩减值的映射数组进行排序
映射.排序(函数(a,b){
返回a.value-b.value;
});
//用于生成订单的容器
var resultPrice=mapped.map(函数(el){
返回价格数组[el.index];
});
var resultUser=mapped.map(函数(el){
返回userIdArray[el.index];
});
write(“”+JSON.stringify(resultPrice,0,4)+“”);

document.write(''+JSON.stringify(resultUser,0,4)+'')基于Rowland的答案,您可以使用如下库创建对象数组:

这将为您提供如下对象:

var sortedUserId = pairs.map( function(p) { return p.userId });
// returns [ 3, 9, 5, 8 ];
然后,对于排序,您可以简单地使用Javascript排序:

如果您确实需要它作为一个userid数组,您可以在排序后将其取回:


我看过一篇关于让不可能状态成为不可能的精彩演讲。这涵盖了两个相关但可能不同步的数组,最好使用一个具有两个属性的对象数组(如多次提到的)

但是,;如果要对两个数组进行变异并以相同的方式对其排序,可以执行以下操作:

//这将改变传入其中的两个数组
//您可以返回数组,但随后需要执行arr.slice(0).sort(…)
const sortSame=sortFn=>(arrayToSort,arrayToSortSame)=>{
常量排序结果=[];
sort(//将改变数组
(a,b)=>{
const result=sortFn(a,b);
排序结果推送(结果);
返回结果
}
);
排序(()=>sortResults.shift());
返回未定义;
}
常量priceArray=[1,5,3,7];
const userIdArray=[11,52,41,5];
常量numSortSameAscending=排序集((a,b)=>a-b);
numSortSameAscending(priceArray、userIdArray);
console.log(
priceArray,userIdArray

)
为什么有两个阵列?这可以通过一个具有id和price属性的对象数组来完成吗?@rrowland,这就是服务器现在所拥有的,我如何从中提升?第一个方法将进行四次不同的迭代@拉贾普拉布瓦拉文达萨米,的确如此。这是来自MDN的。我以前见过这种方法,但对于大型和多个数组,它有一个糟糕的大o。@NinaScholz是的,根据调用排序回调的频率,将数组映射到[index,value],然后进行排序,然后使用排序后的[index,value]映射两个数组可能会更有效,如您的答案所示。映射比排序便宜,所以我会在答案中添加一个警告。
[ 
  { price: 1, userId: 3 },
  { price: 5, userId: 5 },
  ... etc
]
pairs.sort(function(p) { return p.price });
var sortedUserId = pairs.map( function(p) { return p.userId });
// returns [ 3, 9, 5, 8 ];