我想通过点击计数对imgUrl数组进行排序.我有两个数组.
clickCount = [5,2,4,3,1]
imgUrl = ['1.jpg','2.jpg','3.jpg','4.jpg','5.jpg']
Run Code Online (Sandbox Code Playgroud)
在numpy很容易.我用,order = np.argsort(clickCount)然后我创建另一个数组newArray = [imgUrl[i] for i in order].
如何在javascript(最好是vanilla)中实现相同的效果?
您可以在python中使用Schwartzian变换,也称为Decorate-Sort-Undecorate(DSU).
DSU:
演示:
const clickCount = [5,2,4,3,1];
const imgUrl = ['1.jpg','2.jpg','3.jpg','4.jpg','5.jpg'];
const result = imgUrl
.map((item, index) => [clickCount[index], item]) // add the clickCount to sort by
.sort(([count1], [count2]) => count2 - count1) // sort by the clickCount data
.map(([, item]) => item); // extract the sorted items
console.log(result);Run Code Online (Sandbox Code Playgroud)
argsort为了完整起见,这是我通过使用 DSU 扩展 Ori 的答案来解决实际答案(提供函数)的问题。由于 sort 默认情况下采用第一个元素,因此将其实现为 DSU 只需添加一个索引,对其进行排序,然后采用索引。
let decor = (v, i) => [v, i]; // set index to value
let undecor = a => a[1]; // leave only index
let argsort = arr => arr.map(decor).sort().map(undecor);
clickCount = [5, 2, 4, 3, 1]
imgUrl = ['1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg']
order = argsort(clickCount);
newArray = order.map(i => imgUrl[i])
console.log(newArray);Run Code Online (Sandbox Code Playgroud)