繁体   English   中英

根据属性对 object 中的数组进行排序,并返回排序后的初始 object

[英]Sort array from object based on a property and return the sorted initial object

我有以下 object

{
  "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"
    },
    {...},
    {...}
  ]
}

如何根据unit_amount属性对object.data进行排序,并保留 object 的初始值(url,has_more,...)?

我试过使用 Ramda,但它给了我一个新的 object 只是排序数据。

所以我需要对来自初始 object 的 object.data 进行排序,并在排序后返回整个 object。

只是简单的排序,例如

 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}

Javascript 中的对象对其属性没有固有的顺序,而 arrays 有,所以我建议您提取数据数组,对其进行排序,然后替换 object 中的未排序版本。 像这样的东西(为了便于阅读而简化的对象):

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

Ramda 不会让您轻松修改数据,但如果您想使用数组的排序副本创建输入的副本,使用镜头函数lensPropover非常简单:

 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>

在这里,我们从 Alexandr Belan 那里窃取了简单的输入格式。 该答案已经有一些简单的代码。 我认为这更简单——而且它肯定更具声明性——但除非我已经在我的应用程序中使用 Ramda,否则我不会打扰它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM