最有效的方法来取代属性的数组对象的基础上Map使用纯javascript?

fivyi3re  于 2023-04-04  发布在  Java
关注(0)|答案(2)|浏览(113)

给定一个具有动态属性(ID除外)的对象数组,用map中的属性键替换属性键的最佳方法是什么?

// 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];
      }
    }
  }
});
33qvvth1

33qvvth11#

在下面的代码片段中,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对象:只有在该对象中定义的键将被替换为它们的新名称。所有其他键将保持不变。

nhhxz33t

nhhxz33t2#

我过去就是这样做的。
这不是最快的实现,除非你谈论的是成千上万的键重Map,否则这并不重要。
对于一些开发人员来说,这可能是也可能不是最明确的方法,但对我来说肯定是,所以让我分享一下。
它使用:

  • 一键替换函数就是curried,因为我喜欢这种函数组合的方式。
  • 一个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),以防你不想在密钥包含检查上使用原型链;
  • 如果您不喜欢curried这种函数式风格,可以轻松地将其更改为replacekeys = ([km, o]) => ...,然后像records.map(o => replacekeys(colHeaderToFieldApiName, o))一样使用它

相关问题