recorrer objetos eliminar elementos elemento ejemplos buscar bidimensional array agregar javascript arrays string ecmascript-6 numbers

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);