您好,优秀的开发人员,
我想将此对象数组(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" }]
答案 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);