给定一个具有动态属性(Id除外)的对象数组,用映射中的属性键替换属性键的最佳方法是什么?
// For example, array of objects:
var records = [
{"Id": "0035w000036m j7oAAA", "Business Phone": "(212) 842-5501"},
{"Id": "0035w000036mj7oXXX", "Business Phone": "(212) 842-7777"}
];
// Map to pull replacement property from:
var colHeaderToFieldApiName = {"Business Phone": "Phone"};
// Desired output:
var result = [
{"Id": "0035w000036mj7oAAA", "Phone": "(212) 842-5501"},
{"Id": "0035w000036mj7oXXX", "Phone": "(212) 842-7777"}
];
这是我目前所知道的。它是有效的,但只是想知道是否有更好的方法。
records.forEach (function (obj) {
for (const prop in obi) {
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
const fieldApiName = colHeaderToFieldApiName [prop];
if (fieldApiName) {
obji[fieldApiName] = obj[prop];
delete obi[prop];
}
}
}
});
在下面的代码片段中,newKeys
中包含的所有键将替换输入数组中的给定键:
var records = [
{"Id": "0035w000036m j7oAAA", "Business Phone": "(212) 842-5501"},
{"Id": "0035w000036mj7oXXX", "Business Phone": "(212) 842-7777"}
];
// Map to pull replacement property from:
var newKeys = {"Business Phone": "Phone"};
// Desired output:
var result = records.map(o=>
Object.fromEntries( Object.entries(o).map(([k,v])=> [newKeys[k]??k,v] ) )
);
console.log(result);
/* Output
[
{"Id": "0035w000036mj7oAAA", "Phone": "(212) 842-5501"},
{"Id": "0035w000036mj7oXXX", "Phone": "(212) 842-7777"}
];
*/
键替换在newKeys
对象的基础上工作:只有在该对象中定义的键才会被它们的新名称替换。所有其他键将保持不变。
我过去就是这样做的。
这不是最快的实现,除非你在谈论成千上万的键重新映射,否则这无关紧要。
对于某些开发人员来说,这可能是也可能不是最清楚的方法,但对我来说肯定是,所以让我分享一下。
它使用:
一个键替换函数,因为我喜欢这种函数组合方式。
一次
map
遍历应用此函数的对象列表
在这里:
const replacekeys = km => o => Object.fromEntries(
Object.entries(o).map(([k, v]) => [k in km ? km[k] : k, v]))
用法:
records.map(replacekeys(colHeaderToFieldApiName))
指出:
- 你可以使用
o.hasOwnProperty(k)
,如果你不希望原型链上的键包含检查; - 如果你不喜欢curry的那种功能风格,你可以很容易地把它改成
replacekeys = ([km, o]) => ...
,然后像records.map(o => replacekeys(colHeaderToFieldApiName, o))
一样使用