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

时间:2016-06-17 06:49:59

标签: javascript arrays node.js underscore.js 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'}
     ]

任何人都可以帮我这个。

5 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

正如其他人在此指出的那样,根据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 }

答案 2 :(得分:0)

您无法订购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'}
    ]
]

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

我认为执行此工作的一种方法是使用新的Map对象。它将保持键值对的插入顺序。您可以按照插入顺序轻松访问它们(template <typename T, int N> struct VectorStorage { VectorStorage(const size_t) {} T data[N]; }; static const int Dynamic = -1; template <typename T> struct VectorStorage<T, Dynamic> { VectorStorage(const size_t n) : data(new T[n]) {} ~VectorStorage() { delete[] data; } // define copy ops, etc. T* data; }; template <typename T, int N> class Vector { public: Vector(const size_t n) : storage(n) {} T operator[](const size_t i) const { return storage.data[i]; } // etc. private: VectorStorage<T,N> storage; }; Map.prototype.keys())或一起(Map.prototype.values()),并按照您喜欢的方式使用地图。我们来看看......

&#13;
&#13;
Map.prototype.entries()
&#13;
&#13;
&#13;