根据第二个数组对第一个数组进行排序问题

3

我想根据第二个数组中的排序顺序对JavaScript数组进行排序。我已经查看了这里其他类似的问题,并编写了以下代码。但输出结果不符合预期。

var legends = ["Maths","Physics","English","French","Chemistry"];
var sortOrder = [1,400,300,200,-3];

legends.sort( function (a, b) {
    return sortOrder[legends.indexOf(a)] >= sortOrder[legends.indexOf(b)];   
  });


console.log(legends);

期望的输出是:
["Chemistry", "Maths", "French", "English", "Physics"];
  • 化学表示排序为-3
  • 数学表示下一个更高的计数,即1
  • 法语表示下一个更高的计数,即200

我正在尝试使用纯JS或D3js获得所需的输出,不确定我是否做对了!

3个回答

3

你的理解基本正确,但在排序函数中,你引用了被改变的legends数组,因此索引与原始顺序不匹配。

为了证明这一点,你可以复制该数组并对副本进行排序:

var legends = ["Maths","Physics","English","French","Chemistry"];
var legendsToSort = ["Maths","Physics","English","French","Chemistry"];

var sortOrder = [1,400,300,200,-3];

legendsToSort.sort( function (a, b) {
    return sortOrder[legends.indexOf(a)] >= sortOrder[legends.indexOf(b)];   
  });


console.log(legendsToSort);


非常有趣。只是要提到可能的缺点。 - Nina Scholz
我并不是在开玩笑,感谢你指出这个问题。我只是想帮助 OP 理解为什么他的方法不起作用,而不是提供更好的解决方案。 - Francesco
@Francesco,排序值不是唯一的,可能像[1,5,5,4,-3],而图例是唯一的,因为它将在图表中绘制。但正如您所提到的那样,我的数组被改变了。 - FinitePixels
@NinaScholz 这是一个很好的观点,但我的图例数组不会有重复项。 - FinitePixels
接受了答案,但由于声望不足无法点赞 ;( - FinitePixels

3
你可以创建一个有索引的辅助数组,对其进行排序并映射到目标数组。

var legends = ["Maths", "Physics", "English", "French", "Chemistry"],
    sortOrder = [1, 400, 300, 200, -3];

legends = [...legends.keys()]
    .sort((a, b) => sortOrder[a] - sortOrder[b])
    .map(i => legends[i]);        

console.log(legends);


1
很有帮助,希望我能点赞,但由于声望不高,我无法这样做,我是新来的 ;) - FinitePixels

1
尝试以下操作。

var legends = ["Maths","Physics","English","French","Chemistry"];
var sortOrder = [1,400,300,200,-3];

/* Create an array of objects of value index of sortOrder */
legends = Object.entries(sortOrder.reduce((a,v,i) => Object.assign(a, {[v]:i}), {}))
.sort((a,b) => a[0] - b[0]) // Sort array based on sortOrder values
.map(([s, i]) => legends[i]); // fetch items from legends based on sorted order 

console.log(legends);


1
感谢您的时间,希望我能点赞,但由于声望不高,我在这里还是新手;) - FinitePixels

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接