我有一个非常简单的问题。说我有一个数组
a = [10,40,30,20,60,50]
排序后,它会(假设我使用sort_a = a.sort())
sort_a = [60,50,40,30,20,10]
我想创建一个索引数组,指定排序数组中排序后该元素将在哪个位置排序。从上面的例子中,结果将是
a_sortedindices = [6, 3, 4, 5, 1, 2]
..意思是10在排序时位于第6位,40位于第3位......等等
答案 0 :(得分:2)
let values = [10,40,30,20,60,50];
let indices = values
.map((v, i) => ({ v, i }))
.sort((l, r) => r.v - l.v)
.map(({v, i}, i2) => ({ v, i, i2 }))
.sort((l, r) => l.i - r.i)
.map(p => p.i2);
console.log(indices);
这导致一个基于0的索引数组,因为JavaScript使用从0开始的索引。如果您想要在问题中使用基于1的索引,则可以在倒数第二行中将p.i2
更改为p.i2 + 1
。
答案 1 :(得分:2)
除了许多方法之外,还有其中一种方法: 1)使用旧索引将数组转换为另一个
2)按降序对数组进行排序
3)创建一个答案数组,因为你现在知道旧的和新的索引。
let a = [10,40,30,20,60,50];
let transformed = a.map((v,i)=> {
return {num:v,old:i};
});
transformed.sort((a,b)=> {
return b.num - a.num;
});
let ans = [];
transformed.forEach((v,i) => {
ans[v.old] = i+1;
});
console.log(ans);
答案 2 :(得分:1)
不确定这是否是一个技巧问题,或者您是否正在尝试找到实现此目标的最小方法,但您基本上已经拥有它。这就是我想出的:
var a = [10,40,30,20,60,50];
var sort_a = a.slice(0).sort((a1,a2) => a2 - a1);
var a_sortedindices = a.map( a1 => sort_a.indexOf(a1) + 1 );
console.log(a_sortedindices);

走过它,我将解释每个部分。
首先,你需要对它进行排序。看起来你需要反向排序,所以我们将添加一个描述反向排序的箭头函数,但在我们这样做之前,我们还会克隆数组,否则我们将丢失原始索引。值。 .slice(0)
是返回数组克隆的好方法
var sort_a = a.slice(0).sort((a1,a2) => a2 - a1);
然后我们将映射原始数组的每个值。 .map()
很好,很容易快速操作数组中的每个元素。我们使用.indexOf()
来确定它在原始数组中的位置。我们在该值中添加一个,因为您没有使用从零开始的索引。
var a_sortedindices = a.map( a1 => sort_a.indexOf(a1) + 1 );
瞧。你有排序的索引。
答案 3 :(得分:1)
这种工作的天真方式可能是;
var arr = [10,40,30,20,60,50],
idx = arr.map(function(n){return this.indexOf(n)+1;}, arr.slice().sort((a,b) => b-a));
console.log(idx);

this
函数回调的.map()
参数为arr.slice().sort((a,b) => b-a)
答案 4 :(得分:0)
var test = 1;
// Setting function check on a 1000 ms interval
setTimeout(check, 1000)
// If our variable test is == 1, set another interval on 3000ms on next function
function check() {
if (test == 1) {
setInterval(execute, 3000)
}
}
// Execute function
function execute() {
console.log("Called every 3rd second!");
}
P.S。:为了将来的参考,MDN是你的朋友