重置对象顺序 javascript

reset object order javascript

我有一个这样的对象

{ 
   "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

这个怎么样

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);

创建了一个 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"
}

对象属性没有顺序。我假设您想重命名属性,从 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];
}
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++;
    }
});

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

看看这个answer