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': '',
}];
这是我从后端获取的示例对象,现在我想更改对象的顺序。我不想按名称或大小排序......我只想手动更改订单......
答案 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中的字段相同,这节省了我的理智。