2016-10-06 88 views
-2

我有填充像这样一个对象数组:排序对象

valueArr = [{ 
    485: 201.5897, 
    487: 698.52, 
    598: 351.85, 
    ... 
    year: '2016' 
}]; 

现在,我想rearange /排序从最大的对象 - 最小值。该Ouptput我在找会是这样的:

valueArr = [{ 
    487: 698.52, 
    598: 351.85, 
    485: 201.5897, 
    ... 
    year: '2016' 
}]; 

注意:“年” - 属性应被排除在分拣。对象内部只有一个属性。

是否可以重新排列/排序这样的对象?

+4

属性有没有顺序,你可以只使用键和排序他们有序访问。 –

回答

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有效,因为性能次序不是规范的一部分。如果您需要键/值对,您应该更喜欢arrayMap

enter image description here

+0

更好地坚持理论并使用适当的数组。 V8不是唯一的实现。 – Bergi

+0

这取决于,如果op正在编写nodejs应用程序,那么V8就是真正的圣经:) –

0

我想利用对象键调出的对象,并将它们存储在阵列中。然后,我使用该数组对我的键进行排序,使其更喜欢它们,然后创建一个临时新对象,以便按顺序获取我的属性,然后将该临时对象返回到原始对象。

valueArr = sortObject(valueArr) 

function sortObject(parObj){ 
    var keys = []; 
    for(var key in parObj) { keys.push(key) } 
    keys.sort() //or how you choose to sort the numbers 
    var tempObj = {}; 
    for(var i = 0; i < keys.length; i++){ tempObj[keys[i]] = parObj[keys[i]] } 
    return tempObj 
} 
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))

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)