更改对象键的顺序....

IT技术 javascript
2021-01-16 02:48:36
var addObjectResponse = [{
    'DateTimeTaken': '/Date(1301494335000-0400)/',
    'Weight': 100909.090909091,
    'Height': 182.88,
    'SPO2': '222.00000',
    'BloodPressureSystolic': 120,
    'BloodPressureDiastolic': 80,
    'BloodPressurePosition': 'Standing',
    'VitalSite': 'Popliteal',
    'Laterality': 'Right',
    'CuffSize': 'XL',
    'HeartRate': 111,
    'HeartRateRegularity': 'Regular',
    'Resprate': 111,    
    'Temperature': 36.6666666666667,
    'TemperatureMethod': 'Oral',    
    'HeadCircumference': '',    
}];

这是我从后端获取的示例对象,现在我想更改对象的顺序。我不想按名称或大小排序...我只想手动更改顺序...

6个回答

如果您从第一个对象创建一个新对象(正如当前接受的答案所建议的那样),您将始终需要知道对象中的所有属性(维护噩梦)。

使用Object.assign()来代替。

*这适用于现代浏览器——不适用于 IE 或 Edge <12。

 let addObjectResponse = {
        'DateTimeTaken': '/Date(1301494335000-0400)/',
        'Weight': 100909.090909091,
        'Height': 182.88,
        'SPO2': '222.00000',
        'BloodPressureSystolic': 120,
        'BloodPressureDiastolic': 80,
        'BloodPressurePosition': 'Standing',
        'VitalSite': 'Popliteal',
        'Laterality': 'Right',
        'CuffSize': 'XL',
        'HeartRate': 111,
        'HeartRateRegularity': 'Regular',
        'Resprate': 111,    
        'Temperature': 36.6666666666667,
        'TemperatureMethod': 'Oral',    
        'HeadCircumference': '',    
    };

    // Create an object which will serve as the order template
    let objectOrder = {
        'HeartRate': null,
        'HeartRateRegularity': null,
    }

    addObjectResource = Object.assign(objectOrder, addObjectResource);

现在您要订购的两个项目已按顺序排列,其余属性在它们下方。

现在您的对象将如下所示:

{           
            'HeartRate': 111,
            'HeartRateRegularity': 'Regular',
            'DateTimeTaken': '/Date(1301494335000-0400)/',
            'Weight': 100909.090909091,
            'Height': 182.88,
            'SPO2': '222.00000',
            'BloodPressureSystolic': 120,
            'BloodPressureDiastolic': 80,
            'BloodPressurePosition': 'Standing',
            'VitalSite': 'Popliteal',
            'Laterality': 'Right',
            'CuffSize': 'XL',
            'Resprate': 111,    
            'Temperature': 36.6666666666667,
            'TemperatureMethod': 'Oral',    
            'HeadCircumference': '',    
}

我写了这个允许移动键的小算法,它就像 jQuery.insertAfter()方法。您必须提供:

//currentKey: the key you want to move
//afterKey: position to move-after the currentKey, null or '' if it must be in position [0]
//obj: object


function moveObjectElement(currentKey, afterKey, obj) {
    var result = {};
    var val = obj[currentKey];
    delete obj[currentKey];
    var next = -1;
    var i = 0;
    if(typeof afterKey == 'undefined' || afterKey == null) afterKey = '';
    $.each(obj, function(k, v) {
        if((afterKey == '' && i == 0) || next == 1) {
            result[currentKey] = val; 
            next = 0;
        }
        if(k == afterKey) { next = 1; }
        result[k] = v;
        ++i;
    });
    if(next == 1) {
        result[currentKey] = val; 
    }
    if(next !== -1) return result; else return obj;
}

例子:

var el = {a: 1, b: 3, c:8, d:2 }
el = moveObjectElement('d', '', el); // {d,a,b,c}
el = moveObjectElement('b', 'd', el); // {d,b,a,c}
我喜欢把不可能的事情变成可能的人。
2021-04-06 02:48:36

您不能订购 JavaScript 对象键/值对。它以它自己的内部格式存储,所以你永远不应该依赖它的顺序。在 JS 中,一切都是对象,甚至是数组。所以有时你会在同时使用数组表示法和对象表示法时引入错误 ( for x in var)

这个答案当时是正确的,但现在已经过时且不正确:从 ECMAScript 6 开始,您完全可以依赖对象键的顺序。它已成为 JavaScript 规范的一部分。请参阅@Tim Down 或此链接的答案:2ality.com/2015/10/property-traversal-order-es6.html
2021-03-18 02:48:36
在我看到这个 MDN 页面之前,我也有同样的印象:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /... 第一行说Map 对象包含键值对并记住原始插入键的顺序
2021-03-24 02:48:36
虽然这是真的,但这并不像现实世界中的用法,在现实世界中,模板通常是通过循环对象属性来呈现的。当你遍历它们时,它们就有了一个命令。改变这个顺序是……脆弱的,但 IMO 应该添加它。
2021-04-04 02:48:36
现在可以对对象的属性进行排序。
2021-04-14 02:48:36

2020 更新

以下答案在 2011 年撰写本文时是正确的。但是,自 ES6 以来,枚举顺序已被指定为语言的一部分。这是一篇总结这一点的好文章:https : //2ality.com/2015/10/property-traversal-order-es6.html

原答案

JavaScript 中对象的属性没有顺序。在某些浏览器中似乎有一个顺序,但 ECMAScript 规范将对象属性枚举顺序定义为特定于实现的,因此您不应假设一个浏览器的行为与另一个浏览器的行为相同。例如,Chrome 不使用与其他一些浏览器相同的顺序:请参阅这篇冗长的错误报告,了解至少您可能想要的关于此问题的讨论。

如果您需要特定的顺序,请使用一个数组或两个数组(一个用于键,一个用于值)。

您可以使用 Object.keys():

var obj = {
    a: 1,
    b: 2,
    c: 4
};

var new_obj = {};

Object.keys(obj)
.sort(function(a, b) {
    /** Insert your custom sorting function here */
    return a - b;
})
.forEach(function(key) {
    new_obj[key] = obj[key];
});

obj = new_obj;
我做了这样的事情并且没有保留订单。
2021-03-19 02:48:36