如何将一组数字压缩成一系列连续的数字而不会丢失它们的位置?

时间:2015-08-23 16:25:56

标签: javascript jquery arrays

说我有这样的数组:

[34, 55, 12, 66, 2, 43, 230, 67]

现在,如果我们按升序对此数组进行排序,则每个元素都会有一个新索引(从索引0开始)。

现在,我想要的是替换每个元素与索引+ 1 ,但保持元素的顺序。< / p>

期望的输出将是:

[3, 5, 2, 6, 1, 4, 8, 7]

我受限于Javascript和jQuery。我怎样才能做到这一点?

34到3背后的逻辑是,如果你要订购第一个数组,你会得到这个

[2,12,34,43,55,66,67,230]

有了这个 - 你可以看到34是新阵列中的第3个项目。所以它的新值应重置为3。

1 个答案:

答案 0 :(得分:2)

您可以从原始数组中对重复项进行排序和过滤:

&#13;
&#13;
var input = [34, 55, 12, 66, 2, 43, 230, 67];
var sortedAndFiltered = input.concat().sort(function(a, b) {
  return a - b;
}).filter(function(elem, index, self) {
  return index == self.indexOf(elem);
});

var result = [];
for (var i = 0; i < input.length; i++) {
  result.push(sortedAndFiltered.indexOf(input[i]) + 1);
}

alert(JSON.stringify(result));
// at this point the result variable will contain [3, 5, 2, 6, 1, 4, 8, 7]
&#13;
&#13;
&#13;

我们首先克隆原始数组,以避免sort方法使用concat方法对其进行修改。然后我们从结果数组中过滤重复的元素。最后,我们遍历原始数组的元素,并在已排序和过滤的数组中找到它们的索引。