Tengo debajo del archivo json llamado all, y contengo los datos a continuación
[{"name":{"common":"Dominican Republic","official":"Dominican Republic","nativeName":{"spa":{"official":"República Dominicana","common":"República Dominicana"}}},"region":"Americas","area":48671.0,"flags":{"png":"https://flagcdn.com/w320/do.png","svg":"https://flagcdn.com/do.svg"}},{"name":{"common":"Heard Island and McDonald Islands","official":"Heard Island and McDonald Islands","nativeName":{"eng":{"official":"Heard Island and McDonald Islands","common":"Heard Island and McDonald Islands"}}},"region":"Antarctic","area":412.0,"flags":{"png":"https://flagcdn.com/w320/hm.png","svg":"https://flagcdn.com/hm.svg"}},{"name":{"common":"Ghana","official":"Republic of Ghana","nativeName":{"eng":{"official":"Republic of Ghana","common":"Ghana"}}},"region":"Americas","area":238533.0,"flags":{"png":"https://flagcdn.com/w320/gh.png","svg":"https://flagcdn.com/gh.svg"}}]Quiero ordenar este archivo según el nombre. El valor oficial, escribí los códigos a continuación, pero no funciona. ¿Cómo puedo lograr eso?
const path = "../all.json; getCuntries(path); async function getCuntries(path) { const response = await fetch(path); const scrampled = await response.json(); const parsed = await JSON.parse(JSON.stringify(scrampled)); const data = parsed.sort(GetSortOrder("name")); console.log(data) } function GetSortOrder(prop) { return function(a, b) { if (a[prop][1] > b[prop][1]) { return 1; } else if (a[prop][1] < b[prop][1]) { return -1; } return 0; } }Su método de comparación está un poco desordenado. En primer lugar, la comparación de cadenas con operadores > y < puede generar un comportamiento inesperado a veces y esta no es la forma recomendada de comparar cadenas. Y segundo (que es probablemente la causa principal), debe acceder a los valores de los objetos con sus claves y no con índices (como lo está haciendo con [1] ). Esto debería funcionar: conviértalo en el cuerpo de la function (a, b) :
const aPassedProp = a[prop]; const bPassedProp = b[prop]; return aPassedProp.official.localeCompare(bPassedProp.official);El método localeCompare puede comparar sus cadenas de forma adecuada: puede obtener más información aquí .
No puede acceder a una clave de objeto por índice. Como no se especifica si la clave del objeto debe ser dinámica, aquí hay una solución simple donde no lo es:
const data = [ { "name": { "official": "Republic of Ghana"} }, { "name": { "official": "Heard Island and McDonald Islands" } }, { "name": { "official": "Dominican Republic" } }, ]; // shortened for readability const sortArray = (a, b) => { const aCompare = a.name.official; const bCompare = b.name.official; if (aCompare === bCompare) { return 0; } return aCompare < bCompare ? -1 : 1; }; data.sort(sortArray); console.log(data);