使用动态对象键对数组中的对象进行排序

时间:2016-10-06 10:08:09

标签: javascript sorting object

我有一个数组,其中包含一个像这样填充的对象:

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。对象内部只有一个属性。

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

4 个答案:

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

enter image description here

答案 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)