Javascript 根据另一个数组的排序顺序对数组进行排序的数据结构或过程

Javascript 根据另一个数组的排序顺序对数组进行排序的数据结构或过程,javascript,arrays,sorting,Javascript,Arrays,Sorting,例如,我将两个数组输入到Highcharts“series”参数中: A = [25, 100, 50, 12] B = [50, 12, 100, 25] A和B的顺序对应于图表的Y值,因此如果我将A排序为升序,B的顺序必须与A的顺序相匹配,变成: A = [12, 25, 50, 100] B = [25, 50, 100, 12] 最简单的方法是实现一个基本的排序算法,该算法包含两个数组,对于排序a所需的每一步,它都会对B执行相同的步骤,忽略它的内容。但这感觉有点愚蠢——我认为实现一个

例如,我将两个数组输入到Highcharts“series”参数中:

A = [25, 100, 50, 12]
B = [50, 12, 100, 25]
AB的顺序对应于图表的Y值,因此如果我将A排序为升序,B的顺序必须与A的顺序相匹配,变成:

A = [12, 25, 50, 100]
B = [25, 50, 100, 12]
最简单的方法是实现一个基本的排序算法,该算法包含两个数组,对于排序a所需的每一步,它都会对B执行相同的步骤,忽略它的内容。但这感觉有点愚蠢——我认为实现一个数据结构,将这两个数组中的值关联起来&然后允许我对其中一个参数执行排序似乎更明智


唯一需要注意的是,我需要一个对象/数据结构,然后我可以从中提取这两个数组,以便将其插入highcharts。此外,我记得读到过JS规范并没有说普通JS对象需要维护一个顺序,所以我不确定什么是好方法。

一个选项是,从每个项目中,创建一个具有
a
b
属性的对象,对对象数组进行排序,然后再次将它们提取到组件阵列中:

const A=[2510050,12];
常数B=[50,12,100,25];
常量arr=A.map((A,i)=>({A,b:b[i]}));
arr.sort((item1,item2)=>item1.a-item2.a);
const[newA,newB]=arr.reduce(([newA,newB],{a:itemA,b:itemB})=>{
推送(itemA);
新推(b项);
返回[newA,newB];
}, [[],[]]);

控制台日志(newA,newB)我不认为你最初的想法有那么糟糕——只需对一个数组排序,然后对另一个数组重新排序,忽略它的内容。然而,我同意有一种“更好”的方法,只是为了更容易地跟踪和识别您的数据

由于您的两个数组本质上是{a,b}对,因此您可以有一个包含所有数据的数组:

const myData = [{a: 25, b: 50}, {a: 100, b: 12}, {a: 50, b: 100}, {a: 12, b: 25}];
然后,使用排序功能,通过任意一个键对数组进行排序将非常容易:

// Returns a sorting function that sorts your items by an arbitrary key
const sortFunction = key => {return (a, b) => a[key] > b[key]};

myData.sort(sortFunction("a"));
// myData is now sorted with "a" keys in ascending order
myData.sort(sortFunction("b"));
// myData is now sorted with "b" keys in ascending order
如果要再次将数组拆分为两个单独的数组,只需使用
array.map()


您可以创建包含排序顺序索引的常规排序数组。然后,您可以将其映射到您喜欢的任何阵列:

A=[251005012]
设B=[50,12,100,25]
//基于A的排序顺序将按A的排序顺序排列索引
让sort_order=Array.from(A,(_,i)=>i.sort((A,b)=>A[A]-A[b])
设A_sorted=sort_order.map(i=>A[i])
让B_sorted=sort_order.map(i=>B[i])

console.log(A_排序,B_排序)
谢谢您的标记。实现了这个解决方案,因为我的代码基本上是在这类代码之外完成的,它工作起来很有魅力。并没有意识到从A中提取排序顺序可以用如此简单的方式完成。对于将来发现这个问题的任何人来说,如果你从一系列字典开始,那么一定的性能和Jered的答案(因为它们都非常相似)也会很好地工作。
const aValues = myData.map(ea => ea.a);
const bValues = myData.map(ea => ea.b);