【问题标题】:How to Reorder the Array of object properties using javascript or lodash如何使用 javascript 或 lodash 重新排序对象属性数组
【发布时间】:2016-10-18 21:36:01
【问题描述】:

我将要写入 Excel 文件的对象数组。我有这么多这样的对象数组

[{'FirstName':'abc','Reg-no':1234,'branch':'mech','ReportDate':'11/12/2014','LastName':'HR'},{'FirstName':'xyz','Reg-no':1235,'branch':'CS','ReportDate':'11/12/2015','LastName':'BC'},{'FirstName':'pqr','Reg-no':1236,'branch':'IS','ReportDate':'11/12/2016','LastName':'TY'}]

我想像这样重新排序对象属性,以便在 Excel 第一列中它从注册号开始。

 [{'Reg-no':1234,'ReportDate':'11/12/2014','FirstName':'abc','LastName':'HR','branch':'mech'},
     {'Reg-no':1235,'ReportDate':'11/12/2015','FirstName':'xyz','LastName':'BC','branch':'CS'},
     {'Reg-no':1236,'ReportDate':'11/12/2016','FirstName':'pqr','LastName':'TY','branch':'IS'}
     ]

谁能帮帮我。

【问题讨论】:

  • 实际上,你不能对对象的属性进行排序。
  • 感谢@NinaScholz 的回复。有什么建议我们可以修改吗?
  • 您可以使用具有定义顺序的数组,例如[['abc, 1234, 'mech', '11/12/2014', /*...*/]]

标签: javascript arrays node.js underscore.js lodash


【解决方案1】:

这是一个带有数组的提案。第一个元素是具有列描述的数组。其余元素包含具有所需顺序的所需项目。

var data = [{ 'FirstName': 'abc', 'Reg-no': 1234, 'branch': 'mech', 'ReportDate': '11/12/2014', 'LastName': 'HR' }, { 'FirstName': 'xyz', 'Reg-no': 1235, 'branch': 'CS', 'ReportDate': '11/12/2015', 'LastName': 'BC' }, { 'FirstName': 'pqr', 'Reg-no': 1236, 'branch': 'IS', 'ReportDate': '11/12/2016', 'LastName': 'TY' }],
    keys = ['Reg-no', 'ReportDate', 'FirstName', 'LastName', 'branch'],
    array = [keys].concat(data.map(function (a) {
        return keys.map(function (k) {
            return a[k];
        });
    }));


console.log(array);

【讨论】:

    【解决方案2】:

    正如其他人在这里指出的那样,根据 Ecmascript 标准,对象中键的顺序不是固定的。但是,大多数 javascript 引擎会按照对象的创建顺序迭代对象的键。所以你可以这样做:

    function reorder(obj, keys) {
        return keys.reduce((newObj, key) => {
            newObj[key] = obj[key];
            return newObj;
        }, {});
    }
    

    有了这个,打电话给reorder({ a: 3, b: 5, c: 6}, ['b', 'c', 'a'])很可能会给你{ b: 5, c: 6, a: 3 }

    【讨论】:

      【解决方案3】:

      您不能对javascript 对象的属性进行排序,但可以将数据结构化为array

      [
          [
              {name: 'Reg-no', value: 1234},
              {name: 'ReportDate', value: '11/12/2014'},
              {name: 'FirstName', value: 'abc'},
              {name: 'LastName', value: 'HR'},
              {name: 'branch', value: 'mech'}
          ],
          [
              {name: 'Reg-no', value: 1235},
              {name: 'ReportDate', value: '11/12/2014'},
              {name: 'FirstName', value: 'abc'},
              {name: 'LastName', value: 'HR'},
              {name: 'branch', value: 'mech'}
          ],
          [
              {name: 'Reg-no', value: 1236},
              {name: 'ReportDate', value: '11/12/2014'},
              {name: 'FirstName', value: 'abc'},
              {name: 'LastName', value: 'HR'},
              {name: 'branch', value: 'mech'}
          ]
      ]
      

      【讨论】:

        【解决方案4】:

        您可以使用标题模板重新排序。例如:

        var headerTemplate = [ 'A', 'B', 'C', 'D' ];
        
        // Unsorted data
        var data = [ { C: '1:4', A: '1:3', B: '1:2', D: '1:1' },
                     { B: '2:4', C: '2:3', D: '2:2', A: '2:1' },
                     { C: '3:4', B: '3:3', D: '3:2', A: '3:1' } ]
        
        var reorderedData = [];
        while (data.length>0) {
          var row = data.shift();
          var reorderedRow = [];
          headerTemplate.forEach( function(ch) {
            reorderedRow.push( row[ch] );
          });
          reorderedData.push( reorderedRow );
        }
        console.log(reorderedData) // ==>
        
        // [ [ '1:3', '1:2', '1:4', '1:1' ],
        //   [ '2:1', '2:4', '2:3', '2:2' ],
        //   [ '3:1', '3:3', '3:4', '3:2' ] ]
        

        【讨论】:

          【解决方案5】:

          我认为完成这项工作的一种方法是使用新的 Map 对象。它将保持键值对的插入顺序。您可以按照插入的顺序轻松地单独访问它们(Map.prototype.keys()Map.prototype.values())或一起访问它们(Map.prototype.entries()),并以您喜欢的方式使用地图。让我们看看...

          var data = [{'Reg-no':1234,'ReportDate':'11/12/2014','FirstName':'abc','LastName':'HR','branch':'mech'},
                      {'Reg-no':1235,'ReportDate':'11/12/2015','FirstName':'xyz','LastName':'BC','branch':'CS'},
                      {'Reg-no':1236,'ReportDate':'11/12/2016','FirstName':'pqr','LastName':'TY','branch':'IS'}],
          datamaps = data.map(o => new Map().set("Reg-no"    ,o["Reg-no"])
                                            .set("ReportDate",o.ReportDate)
                                            .set("FirstName" ,o.FirstName)
                                            .set("LastName"  ,o.LastName)
                                            .set("branch"    ,o.branch));
          console.log(...datamaps[0].entries());

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-12-10
            • 1970-01-01
            • 1970-01-01
            • 2021-01-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多