Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中撤消排序数组的排序_Javascript_Arrays_Algorithm_Sorting - Fatal编程技术网

在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"]