如何使用javascript或lodash重新排列对象属性的数组

我有我要写入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 First列中从注册编号开始

  [{'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'} ] 

有人能帮助我吗?

这是一个数组提议。 第一个元素是一个列描述的数组。 剩下的元素包含想要的项目与想要的订单。

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

您不能订购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'} ] ] 

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

 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' ] ] 

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

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

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

 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 }