Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.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_Sorting - Fatal编程技术网

如何在javascript中对数组顺序进行排序?

如何在javascript中对数组顺序进行排序?,javascript,arrays,sorting,Javascript,Arrays,Sorting,我不确定这个问题的标题是否正确,也不确定在谷歌上搜索合适的关键词是什么 我有一个数组,看起来像: var myArray = [1,1,2,2,2,3,4,4,4]; 我想把我的数组分为: var myArray = [1,2,3,4,1,2,4,2,4]; 请注意我的预期结果。顺序为升序,但重复值将在最后一个序列上重复,而不是在相邻的键中组合。因此,预期结果分为1,2,3,41,2,4和2,4 感谢您的帮助,并对我的英语不好表示歉意。我的最佳方法是将数组拆分为单独的数组,以获得每个重复的值

我不确定这个问题的标题是否正确,也不确定在谷歌上搜索合适的关键词是什么

我有一个数组,看起来像:

var myArray = [1,1,2,2,2,3,4,4,4];
我想把我的数组分为:

var myArray = [1,2,3,4,1,2,4,2,4];
请注意我的预期结果。顺序为升序,但重复值将在最后一个序列上重复,而不是在相邻的键中组合。因此,预期结果分为
1,2,3,4
1,2,4
2,4


感谢您的帮助,并对我的英语不好表示歉意。

我的最佳方法是将数组拆分为单独的数组,以获得每个重复的值,然后将每个单独的数组进行排列并合并。

此代码有效。但它可能存在一个更好的解决方案

// We assume myArray is already sorted
var myArray = [1,1,2,2,2,3,4,4,4],
    result = [];

while (myArray.length) {
   var value = myArray.shift();

   // Find place
   var index = 0;
   while(result[index] && result[index][result[index].length - 1] == value) index++;

   if(!result[index]) {
      result[index] = [];
   }  

   result[index][result[index].length] = value;
}

result.reduce(function(current, sum) {
  return current.concat(sum);
});

console.log(result) // Display [1, 2, 3, 4, 1, 2, 4, 2, 4]
更新: 我编写了一个快速代码示例,如果inputArray中的同一个数字不超过两次,该示例应该可以工作。您可以通过使其递归来改进它,从而为每个新数字创建新数组并消除限制。我有一些空闲时间,所以我重新编写了一个递归函数,按照您想要的顺序组对任何给定数组进行排序。就像一个符咒,
输入阵列
不需要排序,也不需要任何库

var-inputArray=[3,4,1,2,3,1,2,4,1,2,5,1];
var结果=排序序列(输入阵列);
控制台日志(结果)//输出:[1,2,3,4,5,1,2,3,4,1,2,1]
函数排序顺序(inputArray){
var inputArraySize=inputArray.length,
tempArray=[],//保存我们正在填充的新数组
sameValuesArray=[],//持有我们将在递归调用中作为param传递的相同值
rSorted=[];//如果没有相同的值,则初始化排序数组
对于(变量i=inputArraySize;i>0;i--){
var value=inputArray.pop();
tempArray.push(值);
变量计数器=0,
tempArraySize=tempArray.length;
对于(var j=0;j0){
rSorted=排序序列(sameValuesArray);
}
tempArray.sort();
返回tempArray.concat(rSorted);
}

这是我使用JQuery的方法,它不假设数组已经排序

它将在数组中进行迭代,并且不向tempResultArray重复,一旦完成,它将把它们添加到现有结果中,并再次重复该过程以查找重复项

这不是最有效的方法,但它可以由一个函数处理,并且不需要对数组进行排序

var myArray = [1,1,2,2,2,3,4,4,4],result = [];

while (myArray && myArray.length) {
    myArray = customSort(myArray);
}
console.log(result);

function customSort(myArray){
    var tempResultArray = [], tempMyArray = [];
    $.each(myArray, function(i, el){
        if($.inArray(el, tempResultArray ) === -1){ 
            tempResultArray.push(el);
        }else{
            tempMyArray.push(el); 
        }
   });  
    tempResultArray.sort(function(a, b){return a-b});
    $.merge( result,tempResultArray)
    return tempMyArray;
}

该提案采用了一种直截了当的方法,重点是数组方法

函数萌芽(数组){
返回数组.reduce(函数(r,a){
!r.some(函数(b){
if(b[b.长度-1]document.write(“”+JSON.stringify(sprout([1,1,2,3,3,4,5,5,6,6,6,7]),0,4)+’这里是另一个解决方案:

var myArray=[1,1,2,2,2,3,4,4,4];
函数mySequelArray(arr){
var res=参数[1]| |[];
var nextVal;
var min=Math.min.apply(null,arr);
如果(分辨率长度>0){
nextVal=arr.filter(函数(x){
返回x>res[res.length-1]
}).sort()[0]| | min;
}否则{
nextVal=min;
}
res.push(nextVal);
arr.拼接(arr.indexOf(nextVal),1);
返回(arr.length>0)?mySequelArray(arr,res):res;
}

console.log(mySequelArray(myArray))
如果您有[1,2,3,7,7,7]?@NinaScholz,您期望的结果应该是[1,2,3,7,7,7,7]
var myArray = [1,1,2,2,2,3,4,4,4],result = [];

while (myArray && myArray.length) {
    myArray = customSort(myArray);
}
console.log(result);

function customSort(myArray){
    var tempResultArray = [], tempMyArray = [];
    $.each(myArray, function(i, el){
        if($.inArray(el, tempResultArray ) === -1){ 
            tempResultArray.push(el);
        }else{
            tempMyArray.push(el); 
        }
   });  
    tempResultArray.sort(function(a, b){return a-b});
    $.merge( result,tempResultArray)
    return tempMyArray;
}