javascript - objetos - Ordenar una matriz que contiene números y cadenas
eliminar elemento de un array javascript (9)
¡Aquí estás!
const arr = [9,5,''2'',''ab'',''3'',-1 ]
const numbers = arr.filter(i => typeof i === ''number'');
const numerics = arr.filter(i => typeof i === ''string'' && !isNaN(i));
const strings = arr.filter(i => typeof i === ''string'' && isNaN(i));
numbers.sort();
numerics.sort();
strings.sort()
const result = [].concat(numbers, numerics, strings)
console.log(result)
Mi estrategia fue encontrar primero los tres trozos (números, números y cadenas), y luego concactuarlos.
Estoy tratando de ordenar una matriz que contiene cadenas, números y números como cadenas (por ejemplo, ''1'', ''2''). Quiero ordenar esta matriz de modo que la matriz ordenada contenga primero los números y luego las cadenas que contengan un número y, finalmente, las cadenas.
var arr = [9,5,''2'',''ab'',''3'',-1 ] // to be sorted
arr.sort()
// arr = [-1, 5, 9, "2", "3","ab"] // expected result
//arr = [-1, "2", 5, 9, "ab"] // actual result
Tambien lo he intentado
var number =[];
var char =[];
arr.forEach(a=>{
if(typeof a == ''number'') number.push(a);
else char.push(a);
})
arr = (number.sort((a,b)=> a>b)).concat(char.sort((a,b)=> a>b))
// arr = [-1, 5, 9, "2", "3","ab"] // expected result
// arr = [-1, 5, 9, "2", "ab", "3"]// actual result
El más corto es probablemente:
arr.sort((a, b) => ((typeof b === "number") - (typeof a === "number")) || (a > b ? 1 : -1));
Intenta usar esto:
var arr = [9, 5, ''2'', ''ab'', ''3'', -1];
var number = [];
var strInt = [];
var char = [];
arr.forEach(a => {
if (typeof a === "number") {
number.push(a);
} else if (typeof a === "string" && //d/.test(a)) {
strInt.push(a);
} else {
char.push(a);
}
});
arr = number.concat(strInt.concat(char));
console.log(arr);
Lo que esto hace es hacer tres matrices, una para números, una para cadenas que contienen números y otra para cadenas. Ordena cada elemento en la matriz apropiada, luego finalmente los concatena en el orden correcto.
Parece que has hecho la mayor parte del trabajo en tu segundo intento. Todo lo que he hecho aquí es usar Array.concat
para unir los resultados ordenados de number
y char
.
var arr = [9, 5, ''2'', ''ab'', ''3'', -1] // to be sorted
var number = [];
var char = [];
arr.forEach(a => {
if (typeof a == ''number'') number.push(a);
else char.push(a);
})
var sorted = number.sort().concat(char.sort());
console.log(sorted)
Prueba esto
const arr = [9, 5, ''2'', ''ab'', ''3'', ''AB'', -1];
const sortedArr = arr.sort((a, b) => {
if (typeof a === ''number'' && typeof b === ''number'') {
return a - b;
} else if (typeof a === ''number'') {
return -1;
} else if (typeof b === ''number'') {
return 1;
} else {
return a > b ? 1 : -1;
}
});
console.log(sortedArr);
Esto utiliza la función opcional Array.prototype.sort para ordenar los elementos en una matriz. Debe devolver un número. Si el número> 0, b va primero. Si el número <0, va primero. Si es 0, su posición se mantiene sin cambios.
Puede ordenar los enteros primero y luego los no enteros utilizando .filter()
para separar ambos tipos de datos.
Vea el ejemplo de trabajo a continuación (lea los comentarios del código para obtener una explicación):
const arr = [9,5,''2'',''ab'',''3'',-1];
const nums = arr.filter(n => typeof n == "number").sort(); // If the data type of a given element is a number store it in this array (and then sort)
const non_nums = arr.filter(x => typeof x != "number").sort(); // Store everything that is not a number in an array (and then sort)
const res = [...nums, ...non_nums]; // combine the two arrays
console.log(res); // [-1, 5, 9, "2", "3", "ab"]
Puedes usar el método Array .sort () de todos modos.
Solo necesita proporcionar una función para controlar los criterios de clasificación para cada comparsion.
Ejemplo:
// First of all discretize all kinds of data you want to deal with
function typeClassify(v) {
return typeof v == "number"
? "N"
: isNaN(v) ? "s" : "n"
// (Treat all non numeric values as strings)
;
};
// Second: implement the sorting function
function sortCriteria(a, b) {
var mode = typeClassify(a) + typeClassify(b);
switch (mode) {
case "NN":
return a - b;
case "nn":
return Number(a) - Number(b);
case "ss":
return a == b
? 0
: a > b
? -1 : 1
;
case "Nn":
case "Ns":
case "ns":
return -1;
case "nN":
case "sN":
case "sn":
return 1;
default:
throw "This must never happen";
};
};
// And finally provide that function as a callback for .sort() method
var arr = [9,5,''2'',''ab'',''3'',-1 ] // to be sorted
console.log(arr.sort(sortCriteria));
// arr = [-1, 5, 9, "2", "3","ab"] // expected result
// arr = [ -1, 5, 9, ''2'', ''3'', ''ab'' ] // obtained result
Obviamente, la funcionalidad de la función typeClassify()
se puede sortCriteria()
en sortCriteria()
para guardar una llamada a la función en cada comparsion. Preferí separarlo por claridad.
Quería llevar esto un poco más lejos y evitar hacer un looping de la matriz varias veces para reducir la complejidad y, por lo tanto, aumentar el rendimiento.
Podría realizar una función de clasificación personalizada en la que calcule valores de cadena en charCode
valor de cada carácter de charCode
y los sume y otros números de manejador de mano tal como son.
En este ejemplo de código, luego hice valores de cadena con una potencia de 5, que podemos asegurar que los valores de cadena sean más grandes que los valores numéricos. Esto podría ajustarse según el caso de uso y qué tipo de datos está manejando.
La desventaja de este enfoque es que el rendimiento se ve afectado en función del tiempo de manejo de las cuerdas, por lo que también debes tenerlo en cuenta.
var arr = [90000, 5, ''2'', ''ab'', ''aa'', ''3'', -1] // to be sorted
arr.sort((a,b) => {
if(typeof a === ''string'') {
let temp = 0
for (let s of a) temp += s.charCodeAt(0)
a = Math.pow(temp, 5)
}
if(typeof b === ''string'') {
let temp = 0
for(let s of b) temp += s.charCodeAt(0)
b = Math.pow(temp, 5)
}
return a - b
})
console.log(arr) // [-1, 5, 90000, "2", "3", "aa", "ab"]
var arr=[9,5,''2'',''ab'',''3'',-1];
var string_arr=[];
var number_arr=[];
var string_number_arr=[];
for(var i=0;i<arr.length;i++)
{
if(typeof(arr[i])==''number'')
{
number_arr.push(arr[i]);
}
else if((Number(arr[i]).toString())=="NaN")
{
string_number_arr.push(arr[i]);
}
else
{
string_arr.push(arr[i]);
}
}
string_arr.sort();
number_arr.sort();
string_number_arr.sort();
var arr=number_arr.concat(string_arr,string_number_arr);
console.log(arr);