Hay una serie de objetos que contienen un elemento químico con su año de descubrimiento:
[ {"name": "hydrogen", "discovered": "1766"}, {"name": "boron", "discovered": "1808"}, {"name": "copper", "discovered": "9000 BCE"}, {"name": "argon", "discovered": "1894"}, {"name": "iron", "discovered": "before 5000 BCE"}, {"name": "phosphorus", "discovered": "1669"} ]Lo que quiero es ordenar la matriz en términos del año descubierto, por lo que el más antiguo (cobre en este caso) debe ser el primer elemento y el más reciente (argón) debe ser el último elemento.
//It should look like this in the end: [ {"name": "copper", "discovered": "9000 BCE"}, {"name": "iron", "discovered": "before 5000 BCE"}, {"name": "phosphorus", "discovered": "1669"}, {"name": "hydrogen", "discovered": "1766"}, {"name": "boron", "discovered": "1808"}, {"name": "argon", "discovered": "1894"} ]El problema que encontré fueron las pocas palabras clave como "antes", "BCE", "CE", que no sé cómo manejar.
¿Hay alguna solución para manejar este problema?
9000 BCE es lo mismo que el año -9000 .
Simplemente puede tratar esas cadenas de datos BCE (la palabra clave before podría ignorarse, porque contiene BCE de todos modos) como -year en la función de sort , de la siguiente manera:
const data = [{name:"hydrogen",discovered:"1766"},{name:"boron",discovered:"1808"},{name:"copper",discovered:"9000 BCE"},{name:"argon",discovered:"1894"},{name:"iron",discovered:"before 5000 BCE"},{name:"phosphorus",discovered:"1669"}]; const res = data.sort((a, b) => { const numA = (a.discovered.includes("BCE") ? -1 : 1) * a.discovered.replace(/\D/g, '') const numB = (b.discovered.includes("BCE") ? -1 : 1) * b.discovered.replace(/\D/g, '') return numA - numB }) console.log(res) .as-console-wrapper { max-height: 100% !important; top: 0; } /* ignore this */Muy bien, primero debe crear una función que convierta las fechas a un formato común. En este ejemplo lo convertiré a un número relativo a 0 (año 0):
const beforeRegExp = new RegExp('(before )\\d*( BCE)'); const bceRegExp = new RegExp('\\d*( BCE)'); function toCommonDateFormat(date) { if (beforeRegExp.test(date)) { return date.replace("before ", "").replace(" BCE", "") * -1 } else if (bceRegExp.test(date)) { return date.replace(" BCE", "") * -1 } else { return date * 1; } }Ahora podemos usar esta función en una función de clasificación:
function compareDates(firstDate, secondDate) { return toCommonDateFormat(firstDate) - toCommonDateFormat(secondDate); }Y ahora, para unirlo todo:
const list = [{ "name": "hydrogen", "discovered": "1766" }, { "name": "boron", "discovered": "1808" }, { "name": "copper", "discovered": "9000 BCE" }, { "name": "argon", "discovered": "1894" }, { "name": "iron", "discovered": "before 5000 BCE" }, { "name": "phosphorus", "discovered": "1669" } ] const beforeRegExp = new RegExp('(before )\\d*( BCE)'); const bceRegExp = new RegExp('\\d*( BCE)'); function toCommonDateFormat(date) { if (beforeRegExp.test(date)) { return date.replace("before ", "").replace(" BCE", "") * -1 } else if (bceRegExp.test(date)) { return date.replace(" BCE", "") * -1 } else { return date * 1; } } function compareDates(firstDate, secondDate) { return toCommonDateFormat(firstDate) - toCommonDateFormat(secondDate); } const orderedList = list.sort(function(firstItem, secondItem) { return compareDates(firstItem.discovered, secondItem.discovered); }); console.log(orderedList);