在javascript中撤消排序数组的排序
我有以下代码:在javascript中撤消排序数组的排序,javascript,arrays,algorithm,sorting,Javascript,Arrays,Algorithm,Sorting,我有以下代码: //data_r is an array with values var i = 0; var sort_order = new Array(); data_r.sort(function (a,b) { var res = a[0] - b[0]; sort_order[i] = res; i++; return res; }); 最后,sort_order数组包含对项目进行排序时执行的操作。如果我希望以与第一个数组完全相同的方式对第二
//data_r is an array with values
var i = 0;
var sort_order = new Array();
data_r.sort(function (a,b) {
var res = a[0] - b[0];
sort_order[i] = res;
i++;
return res;
});
最后,sort_order数组包含对项目进行排序时执行的操作。如果我希望以与第一个数组完全相同的方式对第二个数组进行排序,则可以执行以下操作:
//data_x is an array with values
var i = 0;
data_x.sort(function (a,b) {
i++;
return sort_order[i-1];
});
现在,data_x数组的排序方式与data_r数组完全相同
问题是,如何撤消对数据数组的排序?
以下代码不正确:
var unsort = new Array();
for(var i = 0; i < data_r.length; i++)
unsort[i] = sort_order[i]*(-1);//-1 so we perfom the oposite action
var unsort=new Array();
对于(变量i=0;i
为什么
编辑:
我无法复制阵列
我有一个数组#1。我把它分类
然后我接收数组#2,但数组根据数组#1进行排序
我需要反转数组#2上的排序
编辑2:
数组#1={9,5,3,0,2}
我对数组进行排序#1:
数组#1={0,2,3,5,9}
现在我接收到数组#2,根据数组#1排序:
数组#2={“家”、“车”、“火车”、“电脑”、“鼠标”}
我需要这样制作数组#2:
数组#2={“鼠标”、“电脑”、“火车”、“家”、“汽车”}
已解决:您的前提有缺陷 最后,sort_order数组包含对项目进行排序时执行的操作 不,它没有;它包含Javascript
Array.sort
函数执行的比较日志。它响应这些比较结果所采取的操作对它来说是私有的
如果我希望以与第一个数组完全相同的方式对第二个数组进行排序,则可以执行以下操作:
//data_x is an array with values
var i = 0;
data_x.sort(function (a,b) {
i++;
return sort_order[i-1];
});
这并不能保证有效。即使两个数组大小相同,Array.sort
也不一定每次调用时都以相同的顺序比较相同的元素-可能是使用随机算法,可能是基于解释器内部的其他数据执行比较,也可能是在在某些情况下,甚至可以使用多种完全不同的排序算法
虽然此代码可能适合您,但目前在您当前的web浏览器中,在其他情况下(可能在将来的浏览器中),它可能会以令人惊讶的方式失败。请勿在生产代码中使用此技术
问题是,如何取消对数据数组的排序
排序之前,请先复制数组。排序函数只返回一个可以是正、零或负的数字,告诉它当前元素是否在它比较的元素之前、具有相同的权重或之后。我可以想象,由于compa的数量,排序顺序数组比数据数组长在排序之前,我只需复制一份数据,然后在不需要排序时将数据设置为该数组。存储res[I]=a-b就像记录sort()算法-但是如果它使用了随机轴呢? 除非您自己编写sort(),否则此代码本质上是不可靠的,而且效率低下 更好的方法是创建一个索引数组并对其进行排序,这将解决您的两个需求。这对于反转来说很简单。然后您可以实现一个接受索引数组的置换函数,并根据输入实现排序或取消排序 如果x来自0:n-1,则创建一个大小相同的数组sort\u i,然后初始化每个sort\u i[i]=i
for(var i = 0; i < n; i++)
sort_i[i] = i;
现在您有了索引。要应用于x:
for(var i = 0; i < n; i++)
sort_x[i] = x[sort_i[i]];
(变量i=0;i
sort_x[i]=x[sort_i[i]];
要取消排序,请首先反转索引
for(var i = 0; i < n; i++)
unsort_i[sort_i[i]] = i;
(变量i=0;i
取消排序i[排序i[i]]=i;
然后应用这些指数。练习左向提问者提问
当您不想在内存中移动原始元素(可能它们是大对象)时,需要对整数索引数组进行排序,以及许多其他情况。基本上,您是在对指针进行排序。结果是数据索引和反向索引。请参阅@Dashwuff关于您的方法不起作用的原因的回答 相反,只需引入原始数据和排序数据之间的映射
{0:2, 1:3, 2:1, 3:0}
这意味着第一个元素变成了第三个,第二个变成了最后一个,依此类推。下面我们将使用数组而不是对象
为什么此映射有帮助?只需使用其中的索引作为指向要比较的数据的指针,您就可以像其他数据集一样对其进行排序。并且您可以轻松地将映射应用于其他数据集。您甚至可以非常轻松地反转该映射。请参见代码:
// data_r, data_x are arrays with values
var l = data_r.length;
var sort_order = new Array(l);
for (var i=0; i<l; i++) sort_order[i] = i; // initialised as 1-1 mapping
// change the sort_order first:
sort_order.sort(function (a,b) {
// a and b being indices
return data_r[a] - data_r[b];
});
如果您有很多这样的阵列需要维护,那么最好 将array1转换为对象数组,每个对象都包含值 以及它在数组中的原始位置。这使所有东西保持在一起 在一个数组中
var array1 = [9, 5, 3, 0, 2];
var array2 = ["home", "car", "train", "pc", "mouse"];
var sort = function(array){
var indexed_objects = array.map(function(value, index){
return {index: index, value: value};
});
indexed_objects.sort(function(a,b){
return a.value <= b.value ? -1 : 1;
});
return indexed_objects;
};
var sorted1 = sort(array1);
sorted1; // [{index: 3, value:0}, {index: 4, value: 2}, ...]
v1=[0,1,2,3,4,5,6]
q=v1.5米长
b=[]
对于(i=0;i虽然这个问题已经8年了,但我在试图找到问题的相同解决方案时遇到了它,我无法找到一种合适的、高效的、直观的方法,所以我自己写了一个
请查看该库。如果ranks
是按顺序排列数组的索引列表
从“排序展开”导入展开
常数=['♥', '♠', '♣', '♦']
常量秩=[2,0,3,1]
const[sortedSuits,tenet]=放松(等级、套装)
//SortedSuites unsort是什么意思?哇,这是一个非常巧妙的问题。我会在几小时后利用午餐时间来看看这个问题。这应该是sortOrder[I]=res;
?没有“j”“。是的,我想撤销排序。将项目放在其原始位置。是的,随机排序过程的想法并不奇怪。@Pointy:的确-例如,快速排序的随机轴是一种广泛推荐的做法。首先,你确定“它可能使用了随机算法。”?如果阵列是sa
var unsorted = new Array(l);
for (var i=0; i<l; i++)
unsorted[i] = data_r[ sort_order[i] ]; // take it from its new position
var array1 = [9, 5, 3, 0, 2];
var array2 = ["home", "car", "train", "pc", "mouse"];
var sort = function(array){
var indexed_objects = array.map(function(value, index){
return {index: index, value: value};
});
indexed_objects.sort(function(a,b){
return a.value <= b.value ? -1 : 1;
});
return indexed_objects;
};
var sorted1 = sort(array1);
sorted1; // [{index: 3, value:0}, {index: 4, value: 2}, ...]
var unsort = function(array, sorted_objects){
var unsorted = [];
sorted_objects.forEach(function(item, index){
unsorted[item.index] = array[index];
});
return unsorted;
};
var array2_unsorted = unsort(array2, sorted1);
array2_unsorted; // ["mouse", "pc", "train", "home", "car"]