4
votes

Comment trier uniquement les valeurs numériques dans un tableau?

var points = [2, a, t, 5, 4, 3]; et après le tri: var points = [2, a, t, 3, 4, 5];

Avez-vous de l'aide à ce sujet? il est possible de poster votre aide avec du code javascript ancien car je travaille sur un projet Adobe DC?

mon code est là:

var points = [t1, t2, t3, t4];
[t1, t2, t3, t4] = points;

var lucky = points.filter(function(number) {
  return isNaN(number) == false && number !=="" && number!== undefined;
});
points=lucky
points.sort(function(a, b){return a - b});

this.getField("Text6").value = points

mais ceci uniquement trier min à max et filtrer les autres caractères ... j'ai besoin de garder d'autres caractères et de ne raccourcir que les nombres ...


2 commentaires

Bienvenue à SO. L'idée est que vous montrez ce que vous avez essayé, puis nous vous aidons.


sans afficher le code, je pourrais suggérer d'épisser le tableau, de le trier séparément puis de le combiner


4 Réponses :


3
votes

var points = [2, "a", "t", 5, 4, 11, "", 3];
var insert = points.slice(0); // Clone points

// Remove all elements not a number
points = points.filter(function(element) {
  return typeof element === 'number';
});

// Sort the array with only numbers
points.sort(function(a, b) {
  return a - b;
});

// Re-insert all non-number elements
insert.forEach(function(element, index) {
  if (typeof element !== 'number') {
    points.splice(index, 0, element);
  }
});

console.log(points);


6 commentaires

Agréable. En fait, cela ressemble à une bonne question d'entretien à utiliser à l'avenir étant donné le nombre de répondants (moi y compris) qui se sont trompés


Je suis d'accord @pete, c'est d'une simplicité trompeuse.


Pourquoi utilisé uniquement sort () cela ne fonctionnera pas pour des nombres plus grands.


@Armel un bogue que j'ai trouvé est à court et "" valeurs ... et ne pas garder est la position de la table comment résoudre ce problème?


@MaheerAli Vous avez raison, j'ai ajouté une fonction de comparaison dans le sort () .


@hackertom J'ai résolu le problème avec les chaînes vides "" , merci.



1
votes

filter () nombres hors du tableau. Ensuite, sort () , puis parcourez un tableau réel. Et vérifiez si la valeur est Number changez-la en premier élément du tableau trié. Et supprimez le premier élément de sortedArr

let arr = [5, 't', 's', 2,3,4];
let sortedNums = arr.filter(x => typeof x === 'number').sort((a,b) => a-b);
arr.forEach((a,i) => {
  if(typeof a === 'number'){
    arr[i] = sortedNums[0]
    sortedNums.shift();
  } 
})

console.log(arr)


1 commentaires

@MarkMeyer 🤦‍♂️ Vrai



2
votes

Vous pourrez peut-être le faire plus efficacement en évitant splice () si vous réaffectez simplement les valeurs en place.

Filtrer, trier, réassigner pour trier les nombres en place:

let arr = ['c', 2, 'a', 't', 5, 4, 3, 'b', 1]

let n = arr.filter(c => typeof c == "number").sort((a, b) => a-b)
for (let i = 0, c=0; i<arr.length; i++){
    if (typeof arr[i] == "number") arr[i] = n[c++]
}
console.log(arr)


1 commentaires

J'aime votre solution condensée mais j'ai gardé quelque chose d'un peu plus verbeux et moins ES6. Je suppose que cela dépend de ce que vous recherchez;) Merci.



0
votes

Ce qui suit doit donner la sortie exacte compte tenu de votre entrée:

var result = [2, 'a', 't', 5, 4, 3].reduce(
  function(result,item){
    return !isNaN(item)&&item!==''
      ? typeof (result[result.length-1] && result[result.length-1].push) === 'function'
        ? (result[result.length-1].push(item),result)
        : result.concat([[item]])
      : result.concat(item)
  },
  []
).map(
  function(item){
    return typeof item.sort === 'function'
      ? item.sort(function(a,b){return a-b})
      : item
  }
).reduce(
  function(result,item){
    return result.concat(item)
  },[]
);

console.log(result);


2 commentaires

La façon dont j'ai lu la question était de trier tous les nombres en un seul groupe plutôt que de trier les sous-groupes de nombres. Par exemple, la sortie attendue de [2, 'a', 't', 5, 4, 3, 1] serait [1, 'a', 't', 2 , 3, 4, 5] . Le code ci-dessus renvoie [2, 'a', 't', 1, 3, 4, 5] .


@MarkMeyer pourrait aussi être le cas