重新排列对象数组的更有效方法?

时间:2018-07-07 08:59:20

标签: javascript node.js

您好,优秀的开发人员,

我想将此对象数组(array1)重新排列为array2中给定的顺序;正如您可能在下面注意到的那样,array2是一个简单的数组,其值与array1中的键名相同,因此可以说array2是array1的“排列参考”。

下面的代码按预期对我有用,但是我对此不满意,循环中有如此多的循环,恐怕可能效率不高。

我考虑过使用map(),但是我不知道怎么做,是否有更有效的方法通过使用map()或其他方法来做到这一点?

注意:这是服务器端代码,因此我不关心浏览器的兼容性。

            var array1 =
                [
                    { 'aaa': '1000', 'bbb': '2000' },
                    { 'aaa': '3333', 'bbb': '4444' }
                ]

            var array2 = ['bbb', 'aaa'];

            var reArrangedArr = [];


            array1.forEach(x => {
                var obj = {};
                for (i = 0; i < array2.length; i++) {
                    for (key in x) {
                        console.log(array2[i] + " " + key)
                        if (array2[i] === key) {
                            newKey = array2[i];
                            console.log("equal");
                            obj[newKey] = x[key]
                        }
                    }

                }
                reArrangedArr.push(obj);
            });


            console.log(reArrangedArr);

            ///output:  > Array [Object { bbb: "2000", aaa: "1000" }, Object { bbb: "4444", aaa: "3333" }]

2 个答案:

答案 0 :(得分:1)

您可以映射数组并使用Object.assign键和键和键的值按所需顺序进行映射。

使用spread syntax ...,将给定的可迭代对象(如数组或字符串)视为函数调用的参数。基本上,这是function.apply(this, array)的语法建议。

var data = [{ aaa: '1000', bbb: '2000' }, { aaa: '3333', bbb: '4444' }],
    keys = ['bbb', 'aaa'],
    reordered = data.map(o => Object.assign(...keys.map(k => ({ [k]: o[k] }))));
    
console.log(reordered);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)

您可以使用Array.reduce()操作来实现:

 var array1 = [
  { 'aaa': '1000', 'bbb': '2000' },
  { 'aaa': '3333', 'bbb': '4444' }
];

var array2 = ['bbb', 'aaa'];

var reArrangedArr = array1.reduce((acc, obj) => {
  var tempObj = {};
  array2.forEach(item => tempObj[item] = obj[item]);
  acc.push(tempObj);
  return acc;
},
[]);
console.log(reArrangedArr);