最有效的方法来取代基于使用纯javascript映射数组对象的属性?



给定一个具有动态属性(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))一样使用

相关内容

  • 没有找到相关文章

最新更新