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

时间:2015-09-23 07:24:14

标签: 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,4 1,2,42,4

感谢您的帮助,抱歉我的英语不好。

6 个答案:

答案 0 :(得分:3)

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

// 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]

答案 1 :(得分:2)

这是我使用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;
}

JSFiddle

答案 2 :(得分:2)

该提案采用直接的方法,侧重于数组方法。



function sprout(array) {
    return array.reduce(function (r, a) {
        !r.some(function (b) {
            if (b[b.length - 1] < a) {
                b.push(a);
                return true;
            }
        }) && r.push([a]);
        return r;
    }, []).reduce(function (r, a) {
        return r.concat(a);
    });
}

document.write('<pre>' + JSON.stringify(sprout([1, 1, 2, 2, 2, 3, 4, 4, 4]), 0, 4) + '</pre>');
document.write('<pre>' + JSON.stringify(sprout([1, 2, 3, 7, 7, 7]), 0, 4) + '</pre>');
document.write('<pre>' + JSON.stringify(sprout([1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 6, 6, 6, 7]), 0, 4) + '</pre>');
&#13;
&#13;
&#13;

答案 3 :(得分:2)

这是另一个解决方案:

&#13;
&#13;
var myArray = [1, 1, 2, 2, 2, 3, 4, 4, 4];


function mySequelArray(arr) {
    var res = arguments[1] || [];
    var nextVal;
    var min = Math.min.apply(null, arr);

    if (res.length > 0) {
        nextVal = arr.filter(function (x) {
            return x > res[res.length - 1]
        }).sort()[0] || min;
    } else {
        nextVal = min;
    }
    res.push(nextVal);
    arr.splice(arr.indexOf(nextVal), 1);

    return (arr.length > 0) ? mySequelArray(arr, res) : res;


}

console.log(mySequelArray(myArray))
&#13;
&#13;
&#13;

fiddle

答案 4 :(得分:1)

我最好的方法是将数组拆分为每个重复值的单独数组,然后排列每个单独的数组并完全连接。

答案 5 :(得分:1)

<强>更新: 我编写了一个快速代码示例,如果inputArray中的相同数字不超过两次,则该代码应该有效。您可以通过使其递归来改进它,从而为每个新数字创建新数组并消除限制。有一些空闲时间,所以我重新编写了一个递归函数来按顺序对所需的数组进行排序。像魅力一样工作,inputArray不需要排序,也不需要任何库。 Jsfiddle here

var inputArray = [3, 4, 1, 2, 3, 1, 2, 4, 1, 2, 5, 1];
var result = sortInSequence(inputArray);
console.log(result); //output: [1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 1]

function sortInSequence(inputArray){
    var inputArraySize = inputArray.length,
        tempArray = [], //holds new array we are populating
        sameValuesArray = [], //holds same values that we will pass as param in recursive call
        rSorted = []; //init sorted array in case we have no same values

    for(var i = inputArraySize; i > 0; i--){
        var value = inputArray.pop();
        tempArray.push(value);

        var counter = 0,
            tempArraySize = tempArray.length;
        for(var j = 0; j < tempArraySize; j++){
            if(tempArray[j] == value){
                counter++;
            }
        }

        if(counter == 2){
            //value found twice, so remove it from tempArray and add it in sameValuesArray
            var sameValue = tempArray.pop();
            sameValuesArray.push(sameValue);
        }
    }

    if(sameValuesArray.length > 0){
        rSorted = sortInSequence(sameValuesArray);
    }

    tempArray.sort();
    return tempArray.concat(rSorted);
}