Javascript - 排序后获取'WILL BE'关系的索引数组

时间:2017-05-01 20:15:52

标签: javascript arrays sorting indexing

我有一个非常简单的问题。说我有一个数组

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位......等等

5 个答案:

答案 0 :(得分:2)

  1. 将值与其当前索引配对
  2. 根据原始值
  3. 对数组进行排序
  4. 将这些配对与其新指数相结合
  5. 根据原始索引对新阵列进行排序
  6. 从排序数组中获取新索引
  7. 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是你的朋友