【问题标题】:Sort object in array with dynamic object keys [duplicate]使用动态对象键对数组中的对象进行排序[重复]
【发布时间】:2017-02-15 00:46:51
【问题描述】:

我有一个数组,其中填充了一个对象,如下所示:

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

现在,我想从最大值 - 最小值重新排列/排序对象。我正在寻找的输出将是这样的:

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

注意:“年”属性应排除在排序中。对象内部只有一个 this 属性。

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

【问题讨论】:

  • 对象的属性没有顺序,您可以只使用键并将它们排序以进行有序访问。

标签: javascript sorting object


【解决方案1】:

理论上,属性没有顺序,但实际上,由于为每个对象创建了隐藏类,对象属性遵循其插入顺序(具体示例请参见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

【讨论】:

  • 最好坚持理论并改用适当的数组。 V8 不是唯一的实现。
  • 这取决于,如果 op 正在编写 nodejs 应用程序,那么 V8 是真正的圣经 :)
【解决方案2】:

无法保证对象属性的顺序,但您可以控制如何访问对象属性的顺序。

这是一个例子。

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

【讨论】:

    【解决方案3】:

    我喜欢从对象中取出对象键,将它们存储在一个数组中。然后,我使用数组按我喜欢的方式对键进行排序,并创建一个临时新对象,在其中按顺序获取我的属性,并将该临时对象返回给原始对象。

    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
    }
    

    【讨论】:

      【解决方案4】:

      您是在问如何为您整理源代码?像这样?

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-27
        • 1970-01-01
        • 1970-01-01
        • 2020-03-31
        • 2017-05-31
        相关资源
        最近更新 更多