【问题标题】:reset object order javascript重置对象顺序javascript
【发布时间】:2015-05-20 14:36:13
【问题描述】:

我有一个这样的对象

{ 
   "items":{ 
      "2":{ 
         "id":122,
         "product_id":"DE",
         "price":"9.35",
      },
      "4":{ 
         "id":15,
         "product_id":"CH",
         "price":"8.00",
      }
     "7":{ 
         "id":78,
         "product_id":"CH",
         "price":"3.00",
      }
   },
   "total_price":"20.35",
   "item_count":2,
   "unit":"CHF"
}

你知道我是如何重置物品顺序的吗?

现在是 2、4、7

应该是 0、1、2

【问题讨论】:

  • 为什么不用数组?
  • 对象属性没有顺序。我假设您想重命名属性,从 0 开始计数,但是属性值是否保持其原始的相对键名顺序? (所以名称最小的属性重命名为0,次之为1,以此类推)

标签: javascript object reset


【解决方案1】:

创建了一个JSfiddle,向您展示了一种方式。

我正在使用自定义format 函数:

function format(object) {
    var items = {};

    var i = 0;
    for (var index in object.items) {
        items[i] = object.items[index];
        i++;
    }

    object.items = items;
}

结果对象是这样的:

{
    "items": {
        "0": {
            "id": 122,
            "product_id": "DE",
            "price": "9.35"
        },
        "1": {
            "id": 15,
            "product_id": "CH",
            "price": "8.00"
        },
        "2": {
            "id": 78,
            "product_id": "CH",
            "price": "3.00"
        }
    },
    "total_price": "20.35",
    "item_count": 2,
    "unit": "CHF"
}

【讨论】:

    【解决方案2】:

    这个怎么样

    var obj = {
      "items":{
         "2":{
            "id":122,
            "product_id":"DE",
            "price":"9.35",
         },
         "4":{
            "id":15,
            "product_id":"CH",
            "price":"8.00",
         },
        "7":{
            "id":78,
            "product_id":"CH",
            "price":"3.00",
         }
      },
      "total_price":"20.35",
      "item_count":2,
      "unit":"CHF"
    }
    var keys = Object.keys(obj.items)
    
    for (var i = 0; i < keys.length; i++) {
       obj.items[i] = obj.items[keys[i]];
       delete obj.items[keys[i]];
    };
    
    console.log(obj);
    

    【讨论】:

      【解决方案3】:

      对象属性没有顺序。我假设您要重命名属性,从 0 开始计数,但让属性保持其键的原始相对顺序。 (所以名字最小的属性重命名为0,次小为1,以此类推)

      为此,请获取所有属性名称,然后按数字对名称进行排序。然后,将所有值与其排序的属性名称相同。最后,使用新的属性名称重新插入这些属性值。

      var itemsObj = obj["items"];
      
      // get all names
      var propertyNames = Object.keys(itemsObj);
      
      // sort property names in numeric order: ["2", "4", "7"]
      propertyNames.sort(function(a,b){ return a-b; });
      
      // get property values, sorted by their property names
      // ["2", "4", "7"] becomes [{ "id":122, .. }, { "id":15, ... }, { "id":78, ... }]
      var values = propertyNames.map(function(propName) { return itemsObj[propName]; }
      
      // clear out old property and add new property
      for(var i=0; i<values.length; ++i) {
          delete itemsObj[propertyNames[i]];
          itemsObj[i] = values[i];
      }
      

      【讨论】:

        【解决方案4】:
        var data = {
            "items": {
                "2": {
                    "id": 122,
                    "product_id": "DE",
                    "price": "9.35",
                },
                "4": {
                    "id": 15,
                    "product_id": "CH",
                    "price": "8.00",
                },
                "7": {
                    "id": 78,
                    "product_id": "CH",
                    "price": "3.00",
                }
            },
            "total_price": "20.35",
            "item_count": 2,
            "unit": "CHF"
        };
        var indices = Object.keys(data.items).map(function(i) { return parseInt(i, 10); }),
            counter = 0;
        
        indices.sort();
        indices.forEach(function (i) {
            if (i > counter) { // put here some more collision detecting!
                data.items[counter] = data.items[i];
                delete data.items[i];
                counter++;
            }
        });
        

        【讨论】:

        • 哇,伙计,我也看到了.map(parseInt),觉得我学到了一些令人兴奋的东西。
        【解决方案5】:

        无论如何都不能保证对象属性的顺序。您应该改用数组。

        看看这个answer

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-07
          • 2013-06-30
          • 2013-12-22
          • 1970-01-01
          • 2019-01-07
          • 2020-06-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多