Hoe een array van gehele getallen correct te sorteren

Proberen de hoogste en laagste waarde te krijgen van een array waarvan ik weet dat deze alleen gehele getallen zal bevatten, lijkt moeilijker dan ik dacht.

var numArray = [140000, 104, 99];
numArray = numArray.sort();
console.log(numArray)

Antwoord 1, autoriteit 100%

Standaard sorteert de sorteermethode elementen alfabetisch. Om numeriek te sorteren, voegt u gewoon een nieuwe methode toe die numerieke sorteringen afhandelt (sortNumber, hieronder weergegeven) –

var numArray = [140000, 104, 99];
numArray.sort(function(a, b) {
  return a - b;
});
console.log(numArray);

Antwoord 2, autoriteit 13%

Voortbouwend op alle bovenstaande antwoorden, kunnen ze ook als volgt in één regel worden gedaan:

var numArray = [140000, 104, 99];
// ES5
numArray = numArray.sort(function (a, b) {  return a - b;  });
// ES2015
numArray = numArray.sort((a, b) => a - b);
//outputs: 99, 104, 140000

Antwoord 3, autoriteit 5%

array.sortvoert standaard een lexicografische sortering uit, geef voor een numerieke sortering uw eigen functie op. Hier is een eenvoudig voorbeeld:

function compareNumbers(a, b)
{
    return a - b;
}
numArray.sort(compareNumbers);

Houd er ook rekening mee dat sorteren “op zijn plaats” werkt, de toewijzing is niet nodig.


Antwoord 4, autoriteit 5%

Het verbaast me waarom iedereen aanbeveelt om een vergelijkingsfunctie door te geven aan sort(), dat maakt het sorteren erg traag!

Als u getallen wilt sorteren, maakt u elkeTypedArray:

var numArray = new Float64Array([140000, 104, 99]);
numArray = numArray.sort();
console.log(numArray)

Antwoord 5, autoriteit 3%

Dit antwoord is gelijk aan sommige van de bestaande antwoorden, maar ECMAScript 6 pijlfunctiesbieden een veel compactere syntaxis waarmee we een inline sorteerfunctie kunnen definiëren zonder in te boeten aan leesbaarheid:

numArray = numArray.sort((a, b) => a - b);

Het wordt tegenwoordig ondersteund in de meeste browsers.


Antwoord 6, autoriteit 2%

De reden waarom de sorteerfunctie zich zo raar gedraagt

Van de documentatie:

[…] de array wordt gesorteerd op het Unicode-codepunt van elk teken
waarde, volgens de tekenreeksconversie van elk element.

Als u de unicode-puntwaardenvan de array, dan wordt het duidelijk.

console.log("140000".charCodeAt(0));
console.log("104".charCodeAt(0));
console.log("99".charCodeAt(0));
//Note that we only look at the first index of the number "charCodeAt(  0  )"

Antwoord 7

Ik ben het eens met aks, maar in plaats van

. te gebruiken

return a - b;

U zou moeten gebruiken

return a > b ? 1 : a < b ? -1 : 0;

Antwoord 8

In de nieuwe ES6-wereld is het veel gemakkelijker om een sortering te doen

numArray.sort((a,b) => a-b);

Dat is alles wat je nodig hebt 🙂


Antwoord 9

In JavaScript is het standaardgedrag van de methode sort() het alfabetisch sorteren van waarden in een array.

Om op nummer te sorteren, moet u een numerieke sorteerfunctie definiëren (wat heel eenvoudig is):

...
function sortNumber(a, b)
{
  return a - b;
}
numArray = numArray.sort(sortNumber);

Antwoord 10

Array.prototype.sort() is de go to-methode voor het sorteren van arrays, maar er zijn een aantal problemen waar we rekening mee moeten houden.

De sorteervolgorde is standaard lexicografisch en niet numeriek, ongeacht de typen waarden in de array. Zelfs als de array allemaal getallen is, worden alle waarden geconverteerd naar string en lexicografisch gesorteerd.

Dus moeten we de methode sort() en reverse() aanpassen, zoals hieronder.

Doorverwezen URL

Voor het sorteren van getallen binnen de array

numArray.sort(function(a, b)
{
    return a - b;
});

Voor het omkeren van getallen binnen de array

numArray.sort(function(a, b)
{
    return b - a;
});

Doorverwezen URL


Antwoord 11

De vraag is al beantwoord, de kortste manier is om de sort()methode te gebruiken. Maar als u op zoek bent naar meer manieren om uw reeks getallen te sorteren, en u houdt ook van cycli, controleer dan het volgende

Invoeging sorteren

Oplopend:

var numArray = [140000, 104, 99];
for (var i = 0; i < numArray.length; i++) {
    var target = numArray[i];
    for (var j = i - 1; j >= 0 && (numArray[j] > target); j--) {
        numArray[j+1] = numArray[j];
    }
    numArray[j+1] = target
}
console.log(numArray);

Antwoord 12

om undefined, null en NaN te verwerken: Null gedraagt zich als 0, NaN en undefined eindigt.

array = [3, 5, -1, 1, NaN, 6, undefined, 2, null]
array.sort((a,b) => isNaN(a) || a-b)
// [-1, null, 1, 2, 3, 5, 6, NaN, undefined]

Antwoord 13

De functie ‘numeriek’ hieronder dient in veel gevallen voor het numeriek sorteren van een reeks getallen wanneer deze wordt geleverd als een terugbelfunctie:

function numerically(a, b){
    return a-b;
}
array.sort(numerically); 

Maar in sommige zeldzame gevallen, waar array zeer grote en negatieve getallen bevat, kan er een overloopfout optreden als het resultaat van a-b kleiner wordt dan het kleinste getal dat JavaScript aankan.

Dus een betere manier om een numerieke functie te schrijven is als volgt:

function numerically(a, b){
   if(a < b){
      return -1;
   } else if(a > b){
      return 1;
   } else {
      return 0;
   }
}

Antwoord 14

Hoewel niet vereist in JavaScript, als u de sort()compareFunctionom strikt -1, 0 of 1 te retourneren (vergelijkbaar met hoe de ruimteschipoperatorwerkt in PHP), dan kun je Math.sign().

De compareFunctionhieronder retourneert strikt -1, 0 of 1:

numArray.sort((a, b) => Math.sign(a - b));

Opmerking:Math.sign()wordt niet ondersteund in Internet Explorer.


Antwoord 15

Alleen voor een normale reeks elementenwaarden:

function sortArrayOfElements(arrayToSort) {
    function compareElements(a, b) {
        if (a < b)
            return -1;
        if (a > b)
            return 1;
        return 0;
    }
    return arrayToSort.sort(compareElements);
}
e.g. 1:
var array1 = [1,2,545,676,64,2,24]
**output : [1, 2, 2, 24, 64, 545, 676]**
var array2 = ["v","a",545,676,64,2,"24"]
**output: ["a", "v", 2, "24", 64, 545, 676]**

Voor een array van objecten:

function sortArrayOfObjects(arrayToSort, key) {
    function compareObjects(a, b) {
        if (a[key] < b[key])
            return -1;
        if (a[key] > b[key])
            return 1;
        return 0;
    }
    return arrayToSort.sort(compareObjects);
}
e.g. 1: var array1= [{"name": "User4", "value": 4},{"name": "User3", "value": 3},{"name": "User2", "value": 2}]
**output : [{"name": "User2", "value": 2},{"name": "User3", "value": 3},{"name": "User4", "value": 4}]**

Antwoord 16

Bijwerken! Scroll naar de onderkant van het antwoord voor smartSortprop-additief dat nog meer plezier geeft!
Sort arrays van alles!

Mijn persoonlijke favoriete vorm van deze functie staat een parameter toe voor Oplopend of Aflopend:

function intArraySort(c, a) {
    function d(a, b) { return b - a; }
    "string" == typeof a && a.toLowerCase();
    switch (a) {
        default: return c.sort(function(a, b) { return a - b; });
        case 1:
                case "d":
                case "dc":
                case "desc":
                return c.sort(d)
    }
};

Gebruik zo eenvoudig als:

var ara = function getArray() {
        var a = Math.floor(Math.random()*50)+1, b = [];
        for (i=0;i<=a;i++) b.push(Math.floor(Math.random()*50)+1);
        return b;
    }();
//    Ascending
intArraySort(ara);
console.log(ara);
//    Descending
intArraySort(ara, 1);
console.log(ara);
//    Ascending
intArraySort(ara, 'a');
console.log(ara);
//    Descending
intArraySort(ara, 'dc');
console.log(ara);
//    Ascending
intArraySort(ara, 'asc');
console.log(ara);

jsFiddle


Of hier een voorbeeld van een codefragment!

function intArraySort(c, a) {
	function d(a, b) { return b - a }
	"string" == typeof a && a.toLowerCase();
	switch (a) {
		default: return c.sort(function(a, b) { return a - b });
		case 1:
		case "d":
		case "dc":
		case "desc":
		return c.sort(d)
	}
};
function tableExample() {
	var d = function() {
			var a = Math.floor(50 * Math.random()) + 1,
				b = [];
			for (i = 0; i <= a; i++) b.push(Math.floor(50 * Math.random()) + 1);
			return b
		},
		a = function(a) {
			var b = $("<tr/>"),
				c = $("<th/>").prependTo(b);
			$("<td/>", {
				text: intArraySort(d(), a).join(", ")
			}).appendTo(b);
			switch (a) {
				case 1:
				case "d":
				case "dc":
				case "desc":
					c.addClass("desc").text("Descending");
					break;
				default:
					c.addClass("asc").text("Ascending")
			}
			return b
		};
	return $("tbody").empty().append(a(), a(1), a(), a(1), a(), a(1), a(), a(1), a(), a(1), a(), a(1))
};
tableExample();
table { border-collapse: collapse; }
th, td { border: 1px solid; padding: .25em .5em; vertical-align: top; }
.asc { color: red; }
.desc { color: blue }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<table><tbody></tbody></table>

Antwoord 17

Probeer deze code:

HTML:

<div id="demo"></div>

JavaScript-code:

<script>
    (function(){
        var points = [40, 100, 1, 5, 25, 10];
        document.getElementById("demo").innerHTML = points;
        points.sort(function(a, b){return a-b});
        document.getElementById("demo").innerHTML = points;
    })();
</script>

Antwoord 18

Probeer deze code zoals hieronder

var a = [5, 17, 29, 48, 64, 21];
function sortA(arr) {
return arr.sort(function(a, b) {
return a - b;
})
;} 
alert(sortA(a));

Antwoord 19

Dit is de reeds voorgestelde en geaccepteerde oplossing als methode op het Array-prototype:

Array.prototype.sortNumeric = function () {
    return this.sort((a, b) => a - b);
};
Array.prototype.sortNumericDesc = function () {
    return this.sort((a, b) => b - a);
};

Antwoord 20

TypeScript-variant

const compareNumbers = (a: number, b: number): number => a - b
myArray.sort(compareNumbers)

Antwoord 21

var numArray = [140000, 104, 99];
numArray = numArray.sort((a,b) => a-b);
alert(numArray)

Antwoord 22

sort_mixed

Object.defineProperty(Array.prototype,"sort_mixed",{
    value: function () { // do not use arrow function
        var N = [], L = [];
        this.forEach(e => {
            Number.isFinite(e) ? N.push(e) : L.push(e);
        });
        N.sort((a, b) => a - b);
        L.sort();
        [...N, ...L].forEach((v, i) => this[i] = v);
        return this;
    })

probeer a =[1,'u',"V",10,4,"c","A"].sort_mixed(); console.log(a)


Antwoord 23

Als iemand niet begrijpt hoe Array.sort()werkt met gehele getallen, lees dan dit antwoord.

Alfabetische volgorde:

Standaard sorteert de methode sort() de waarden als tekenreeksen in alfabetische en oplopende volgorde.

const myArray = [104, 140000, 99];
myArray.sort();
console.log(myArray); // output is [104, 140000, 99]

Oplopende volgorde met array.sort(compareFunction):

const myArray = [104, 140000, 99];
myArray.sort(function(a, b){
  return a - b;
});
console.log(myArray); // output is [99, 104, 140000]

Uitleg van w3schools:

compareFunctiondefinieert een alternatieve sorteervolgorde. De functie moet een negatieve, nul of positieve waarde retourneren, afhankelijk van de argumenten, zoals:
functie(a, b){return a-b}
Wanneer de methode sort() twee waarden vergelijkt, verzendt deze de waarden naar de vergelijkingsfunctie en sorteert de waarden volgens de geretourneerde (negatieve, nul, positieve) waarde.

Voorbeeld:

Bij het vergelijken van 40 en 100 roept de sort()-methode de vergelijking aan
functie(40.100).

De functie berekent 40-100, en retourneert -60 (een negatieve waarde).

De sorteerfunctie sorteert 40 als een waarde lager dan 100.

Aflopende volgorde met array.sort(compareFunction):

const myArray = [104, 140000, 99];
myArray.sort(function(a, b){
  return b - a;
});
console.log(myArray); // output is [140000, 104, 99]

Deze keer hebben we berekend met b - a(d.w.z. 100-40), wat een positieve waarde oplevert.


Antwoord 24

Arrays met objecten sorteren. Matrix[{obj}, [obj]]

const arrNames = [
    { name: 'Andrzej' },
    { name: 'Mikolaj' },
    { name: 'Witalik' },
    { name: 'Iwan' },
    { name: 'Kasia' },
    { name: 'Joanna' },
    { name: 'Zuzanna' },
    { name: 'Anatol' },
  ];
 arrNames.sort(function (a, b): number {
   const x = a.name.toUpperCase();
   const y = b.name.toUpperCase();
   return x === y ? 0 : +(x > y) || -1; // change ">" for sorting
 });

of kort:

arrNames.sort((a, b) => a.name.localeCompare(b.name));
arrNames.sort((a, b) => b.name.localeCompare(a.name));

Arrays-nummers sorteren:

const arrNum = [1, 80, 3, 2, 4, 6, 5, 12, 20, 100000];
arrNum.sort((a, b) => a - b);
arrNum.sort((a, b) => b - a);

Deze functie sorteert Arrays [getallen en tekenreeksen]

[arrNames or arrNum].sort((a, b) => (a === b ? 0 : +(a > b) || -1));

Antwoord 25

U kunt de hoogte en het laagste aantal eenvoudig verkrijgen door de ingebouwde functie max()en min()te gebruiken

var numArray = [140000, 104, 99];
console.log(Math.max(...numArray));
console.log(Math.min(...numArray));

Als u in oplopende of aflopende volgorde wilt sorteren

numArray.sort((a, b)=> a - b);

Meer weten


Antwoord 26

Het geaccepteerde antwoord, numArray.sort((a,b) => a - b), is geweldig als de array alleen getallen bevat zonder oneindigheden of NaN. Het kan worden uitgebreid om oneindigheden en NaN aan te kunnen, zoals:

numArray.sort((a,b) => (+a || 0) - (+b || 0) || 0);

Dit sorteert NaN (of een niet-getal, zoals ‘foo’ of {}) alsof het 0 is. De laatste || 0is nodig om het geval te behandelen waarin a en b gelijke oneindigheden zijn.


Antwoord 27

As sort-methode zet Array-elementen om in string. Dus, onderstaande manier werkt ook prima met decimale getallen met array-elementen.

let productPrices = [10.33, 2.55, 1.06, 5.77];
console.log(productPrices.sort((a,b)=>a-b));

En geeft je het verwachte resultaat.


Antwoord 28

Sorteer gehele getallen > 0, denk buiten de kaders:

function sortArray(arr) {
  return new Promise((resolve) => {
    const result = []
    arr.forEach((item) => {
      setTimeout(() => {
        result.push(item)
        if (result.length === arr.length) resolve(result)
      }, item)
    })
  })
}
sortArray([4, 2, 42, 128, 56, 2]).then((result) => {
  document.write(JSON.stringify(result))
})

Antwoord 29

Je kunt getallenreeksen eenvoudig sorteren op

const num=[13,17,14,19,16];
let temp;
for(let i=0;i<num.length;i++){
    for(let j=i+1;j<num.length;j++){
        if(num[i]>num[j]){
            temp=num[i]
            num[i]=num[j]
            num[j]=temp
        }
    }
}
console.log(num);

Antwoord 30

  1. Oplopend

    constante bewegingen = [200, 450, -400, 3000, -650, -130, 70, 1300];

Als we iets teruggeven < 0 dan komt A voor B
Als we iets teruggeven > 0 dan komt B voor A

movements.sort((a, b) => {
      if (a > b) return 1; //- (Switch order)
      if (a < b) return -1; //- (Keep order)
    });

a – huidige waarde, b – de volgende waarde.

  1. Aflopend

    bewegingen.sort((a, b) => {
    als (a > b) retourneert -1; // – (Houden)
    als (a < b) retourneert 1; // – (Schakelaar)
    });

! Verbeteren, beste oplossing!

movements.sort ((a, b) => a - b); // Same result!

Als een < b het is een negatief getal (schakelaar)
Als een < b het is een negatief getal (Keep)

Other episodes