Estoy tratando de ordenar estos datos que contienen varias matrices de objetos, el archivo console.log de myData es algo así como:
[ { name: 'Cdb', image: 'xxx', coll: 'xxx' }, { name: 'Bcd', image: 'xxx', coll: 'xxx', url: 'myurl' } ] [ { name: 'Abc', image: 'xxx', coll: 'xxx' } ] Estoy tratando de ordenarlo alfabéticamente (según el valor del name ) y si el objeto tiene el parámetro url , colóquelo al principio.
Entonces la salida sería:
name: 'Cdb', image: 'xxx', coll: 'xxx', url: 'myurl' name: 'Abc', image: 'xxx', coll: 'xxx' name: 'Bcd', image: 'xxx', coll: 'xxx'lo que probé es esto, y muchas variaciones, pero no funciona:
var myData = props?.data console.log(props?.data) if(props.data){ // those with url first, then alphabetically myData = props.data.sort(function(a, b){ return b.url? 1 || (a.name < b.name) : -1; }) }Puedes usar !url como un número (0 o 1) y restarlos:
const arr = [{"name":"Cdb","image":"xxx","coll":"xxx"},{"name":"Bcd","image":"xxx","coll":"xxx","url":"myurl"},{"name":"Abc","image":"xxx","coll":"xxx"}] arr.sort((a, b) => !a.url - !b.url || a.name.localeCompare(b.name)); console.log(arr) Esto quiere decir que si exactamente uno de los dos tiene el argumento url , ese debe ir primero. De lo contrario (si ambos lo tienen, o ninguno lo tiene), entonces el name es decisivo.
De esta forma, cuando varios objetos tengan el argumento url , también estarán ordenados entre ellos por name .