tengo el siguiente objeto
{ "object": "list", "url": "/v1/prices", "has_more": false, "data": [ { "id": "price_1KHlU72eZvKYlo2CblI51Z8e", "object": "price", "active": true, "billing_scheme": "per_unit", "created": 1642150211, "currency": "usd", "livemode": false, "lookup_key": null, "metadata": {}, "nickname": null, "product": "prod_Kxgr3hZDfHnqu1", "recurring": { "aggregate_usage": null, "interval": "month", "interval_count": 1, "usage_type": "licensed" }, "tax_behavior": "unspecified", "tiers_mode": null, "transform_quantity": null, "type": "recurring", "unit_amount": 2, "unit_amount_decimal": "2" }, {...}, {...} ] }¿Cómo puedo ordenar el object.data de él en función de la propiedad unit_amount y también mantener los valores iniciales del objeto (url, has_more, ...)?
Intenté usar Ramda, pero me está dando un nuevo objeto solo con los datos ordenados.
Entonces necesito object.data del objeto inicial para ordenar y devolver el objeto completo después de ordenar.
Ramda no le facilitará la modificación de datos, pero si desea crear una copia de su entrada con una copia ordenada de la matriz, eso es bastante simple usando las funciones de lente lensProp y over :
const sortData = over (lensProp ('data'), sortBy (prop ('unit_amount'))) const obj = {object: "list", url: "/v1/prices", has_more: false, data: [{unit_amount: 2,}, {unit_amount: 1,}, {unit_amount: 3,}, {unit_amount: 9,}, {unit_amount: 5,} ]}; console .log (sortData (obj)) .as-console-wrapper {max-height: 100% !important; top: 0} <script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.27.2/ramda.min.js"></script> <script>const {over, lensProp, sortBy, prop} = R </script>Aquí robamos el formato de entrada simple de Alexandr Belan. Esa respuesta ya tiene un código simple. Creo que esto es más simple, y definitivamente es más declarativo, pero no me molestaría a menos que ya estuviera usando Ramda en mi aplicación.
Simplemente clasificación simple, por ejemplo
const obj = { "object": "list", "url": "/v1/prices", "has_more": false, "data": [ {"unit_amount": 2,}, {"unit_amount": 1,}, {"unit_amount": 3,}, {"unit_amount": 9,}, {"unit_amount": 5,}, ] }; const newObj = { ...obj, data: obj.data.sort((o1, o2) => o1.unit_amount - o2.unit_amount) }; console.log(newObj) .as-console-wrapper {max-height: 100% !important; top: 0}Los objetos en Javascript no tienen un orden inherente a sus propiedades, mientras que las matrices sí lo tienen, por lo que le sugiero que extraiga la matriz de datos, la clasifique y luego reemplace la versión sin clasificar en su objeto. Algo como esto (objeto simplificado para facilitar la lectura):
o = { "object": "list", "url": "/v1/prices", "has_more": false, "data": [ { "id": "price_1KH", "unit_amount": 12, }, { "id": "price_7QW", "unit_amount": 3, }, { "id": "price_4DD", "unit_amount": 7, }, ] } let data = o.data; data.sort((x, y) => x.unit_amount - y.unit_amount); o.data = data; console.dir(o); VM694:23 Object data: Array(3) 0: {id: 'price_7QW', unit_amount: 3} 1: {id: 'price_4DD', unit_amount: 7} 2: {id: 'price_1KH', unit_amount: 12} length: 3 [[Prototype]]: Array(0) has_more: false object: "list" url: "/v1/prices" [[Prototype]]: Object