Tengo una matriz de objetos como a continuación:
var stores = [ { "name": "store3", "ditance": 8 }, { "name": "Store5", "distance": 7, "web": { "validateAttributes": { "isSelectedDispostionSupported": true, "isFutureOrderPossible": false } } }, { "name": "Store1", "distance": 12, "web": { "validateAttributes": { "isSelectedDispostionSupported": true, "isOpen": true } } }, { "name": "store2", "distance": 13, "web": { "validateAttributes": { "isSelectedDispostionSupported": true, "isOpen": true } } } ]El resultado esperado se ordenará en función de la apertura y la distancia
[ { "name": "Store1", "distance": 12, "web": { "validateAttributes": { "isSelectedDispostionSupported": true, "isOpen": true } } }, { "name": "store2", "distance": 13, "web": { "validateAttributes": { "isSelectedDispostionSupported": true, "isOpen": true } } }, { "name": "Store5", "distance": 7, "web": { "validateAttributes": { "isSelectedDispostionSupported": true, "isFutureOrderPossible": false } } }, { "name": "store3", "ditance": 8 } ]Necesito ordenar una matriz según isOpen y distancia. El desafío es que algunos objetos tienen propiedades web y otros no. Incluso si la web está disponible, a veces isOpen no lo hará. He intentado el siguiente enfoque, no funciona.
const sorter = (a, b) => { if (a.web) { if (a.web.validateAttributes) { if (a.web.validateAttributes.isOpen) { return 1; } else if (b.web.validateAttributes.isOpen) { return -1; } else { return 1; }; } else { return 1; } } else { return 1; } }; stores.sort(sorter);Prueba esto
const stores = [{"name":"store3","ditance":8},{"name":"Store5","distance":7,"web":{"validateAttributes":{"isSelectedDispostionSupported":true,"isFutureOrderPossible":false}}},{"name":"Store1","distance":12,"web":{"validateAttributes":{"isSelectedDispostionSupported":true,"isOpen":true}}},{"name":"store2","distance":13,"web":{"validateAttributes":{"isSelectedDispostionSupported":true,"isOpen":true}}}] const sorter = (a,b)=> { if(!b.web) { return -1; } else if(!b.web.validateAttributes) { return -1; } else if(!b.web.validateAttributes.isOpen) { return -1; } return (a.distance - b.distance) } console.log(stores.sort(sorter))Prueba esto.
const stores = [{"name":"store3","ditance":8},{"name":"Store5","distance":7,"web":{"validateAttributes":{"isSelectedDispostionSupported":true,"isFutureOrderPossible":false}}},{"name":"Store1","distance":12,"web":{"validateAttributes":{"isSelectedDispostionSupported":true,"isOpen":true}}},{"name":"store2","distance":13,"web":{"validateAttributes":{"isSelectedDispostionSupported":true,"isOpen":true}}}] const sorted = stores.slice(); sorted.sort((a, b) => { if (!a.web || !b.web) { return -1; } if (!a.web.validateAttributes || !b.web.validateAttributes) { return -1; } const x = a.web.validateAttributes.isOpen || false; const y = b.web.validateAttributes.isOpen || false; return (x === y) ? a.distance - b.distance : -1; }) console.log(sorted) .as-console-wrapper { max-height: 100% !important; top: 0; }Veo 2 problemas.
var stores = [{"name":"store3","distance":8},{"name":"Store5","distance":7,"web":{"validateAttributes":{"isSelectedDispostionSupported":true,"isFutureOrderPossible":false}}},{"name":"Store1","distance":12,"web":{"validateAttributes":{"isSelectedDispostionSupported":true,"isOpen":true}}},{"name":"store2","distance":13,"web":{"validateAttributes":{"isSelectedDispostionSupported":true,"isOpen":true}}}]; stores.sort((a, b) => { if (a.web?.validateAttributes?.isOpen && b.web?.validateAttributes?.isOpen || !a.web?.validateAttributes?.isOpen && !b.web?.validateAttributes?.isOpen) { return a.distance - b.distance; } if (a.web?.validateAttributes?.isOpen) { return -1; } return 1; }) console.log(stores);