我有一个数组,其中包含一个像这样填充的对象:
valueArr = [{
485: 201.5897,
487: 698.52,
598: 351.85,
...
year: '2016'
}];
现在,我想从最大 - 最小值重新排列/排序对象。我正在寻找的Ouptput将是这样的:
valueArr = [{
487: 698.52,
598: 351.85,
485: 201.5897,
...
year: '2016'
}];
注意:排序中应排除" year" -property。对象内部只有一个属性。
是否可以重新排列/排序这样的对象?
答案 0 :(得分:1)
无法保证对象属性顺序,但您可以控制如何访问对象属性的顺序。
这是一个例子。
var valueArr = [{
485: 201.5897,
487: 698.52,
598: 351.85,
year: '2016'
}];
var tmp = {};
var sortedByVal = Object.keys(valueArr[0])
.filter( x => /^\d/g.test(x))
.map(function(x) {
tmp[this[x]] = x;
return this[x];
},valueArr[0])
.sort((a,b) => b - a);
sortedByVal.forEach(x => console.log(tmp[x], ':', x))
答案 1 :(得分:0)
理论上,属性没有顺序,但实际上,由于为每个对象创建了隐藏类,对象属性遵循其插入顺序(具体示例请参见V8 description)。
因此,您可以对键进行排序:
function sortPropertiesByValue(object) {
const keys = Object.keys(object);
const valuesIndex = keys.map(key => ({ key, value: object[key] }));
valuesIndex.sort((a,b) => b.value - a.value); // reverse sort
const newObject = {};
for (const item of valuesIndex) {
newObject[item.key] = item.value;
}
return newObject;
}
请记住,这仅适用于某些JS引擎,例如V8,因为属性顺序不是规范的一部分。如果您需要键/值对,则应该更喜欢array
或Map
。
答案 2 :(得分:0)
我喜欢将对象键从对象中取出,将它们存储在数组中。然后我使用数组来排序我喜欢它们的键,并创建一个临时的新对象,我按顺序获取我的属性,然后将该临时对象返回给原始对象。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.4</version>
<scope>provided</scope>
</dependency>
答案 3 :(得分:0)
您是否在询问如何为您排序源代码?喜欢这个?
487: 698.52,
598: 351.85,
485: 201.5897,
year: 2016
如果是这种情况,此脚本将以排序的方式打印出属性名称和值:
function sortAndPrintMagic(opsObject) {
var sortedArray = []
for (var i1 in opsObject) {
// Ignore the 'year' attribute
if (i1 == 'year')
continue;
var i3 = 0;
for (var i2 in sortedArray) {
if (opsObject[i1] > opsObject[sortedArray[i2]])
break;
else
i3++;
}
sortedArray.splice(i3, 0, i1);
}
var result = ""
for (var i in sortedArray)
result += sortedArray[i] + ": " + opsObject[sortedArray[i]] + ",\n";
result += "year: " + opsObject.year;
console.log(result);
}
valueArr = {
485: 201.5897,
487: 698.52,
598: 351.85,
year: '2016'
};
sortAndPrintMagic(valueArr)