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

时间:2011-08-05 16:51:56

标签: javascript

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': '',    
}];

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

11 个答案:

答案 0 :(得分:12)

您无法订购JavaScript对象键/值对。它以自己的内部格式存储,因此您永远不应该依赖于它的顺序。在JS中,一切都是Object,甚至是Array。因此,有时您可以在使用数组表示法和对象表示法(for x in var

时引入错误

答案 1 :(得分:8)

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

改为使用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': '',    
}

答案 2 :(得分:6)

JavaScript中对象的属性没有订单。在某些浏览器中可能会出现订单,但ECMAScript规范将对象属性枚举顺序定义为特定于实现,因此您不应假设一个浏览器的行为与另一个浏览器的行为相同。例如,Chrome与其他浏览器使用的顺序不同:请参阅this lengthy bug report至少尽可能多地讨论此问题。

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

答案 3 :(得分:6)

我写了这个允许移动键的小算法,就像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}

答案 4 :(得分:5)

您可以使用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;

答案 5 :(得分:1)

我认为这在JavaScript中是不可能的。

您可以创建一个包含订单中字段名称的数组,您可以遍历此数组并从实际对象中获取字段。

答案 6 :(得分:0)

只需按照您喜欢的顺序引用对象键:

aKeys = [
  addObjectResponse[0].DateTimeTaken,
  addObjectResponse[0].Weight,
  addObjectResponse[0].Height,
  ...etc...
]

答案 7 :(得分:0)

如果您想手动重新排序。只需创建新对象并使用旧对象分配值。

var newObject= [{
    'DateTimeTaken': addObjectResponse.DateTimeTaken,
    'Weight': addObjectResponse.Weight,
    'Height': addObjectResponse.Height,
    'SPO2': addObjectResponse.SPO2 
}];

答案 8 :(得分:0)

function orderKeys(obj, keys){
    const newObj = {};
    for(let key of keys){
        newObj[key] = obj[key];
    }
    return newObj;
}

答案 9 :(得分:0)

如果您不想创建新对象,则可以使用以下代码段。

function orderKey(obj, keyOrder) {
    keyOrder.forEach((k) => {
        const v = obj[k]
        delete obj[k]
        obj[k] = v
    })
}

这是一个codepen:https://codepen.io/zhangyanwei/pen/QJeRxB

答案 10 :(得分:0)

我喜欢Chamika Sandamal批准的答案。这是一个简单的函数,它使用相同的逻辑,但是可以根据需要自由更改顺序。

function preferredOrder(obj, order) {
    var newObject = {};
    for(var i = 0; i < order.length; i++) {
        if(obj.hasOwnProperty(order[i])) {
            newObject[order[i]] = obj[order[i]];
        }
    }
    return newObject;
}

为它提供一个对象以及所需的键名数组,并返回一个按顺序排列的属性的新对象。

var data = {
    c: 50,
    a: 25,
    d: 10,
    b: 30
};

data = preferredOrder(data, [
    "a",
    "b",
    "c",
    "d"
]);

console.log(data);

/*
    data = {
        a: 25,
        b: 30,
        c: 50,
        d: 10
    }
*/

我正在将一个大JSON对象复制并粘贴到CMS中,并对源JSON进行一些重新组织,使其顺序与CMS中的字段相同,这节省了我的理智。