繁体   English   中英

JavaScript - 如何更改对象数组中的对象键?

[英]JavaScript - How to change object keys in an array of object?

我有一个对象数组:

let data = [
  { "date" : "17/03/2022", "count" : 2, "james@email.net" : 2 },
  {
    "date" : "17/05/2022",
    "count" : 2,
    "admin@email.com" : 1,
    "secretary@email.uk" : 1
  },
  { "date" : "17/07/2022", "count" : 7, "staff@email.us" : 7 },
];

我想删除对象键中的“@”而不是电子邮件地址。

这是预期的输出

// Expected output:
data = [
  { "date" : "17/03/2022", "count" : 2, "james" : 2 },
  {
    "date" : "17/05/2022",
    "count" : 2,
    "admin" : 1,
    "secretary" : 1
  },
  { "date" : "17/07/2022", "count" : 7, "staff" : 7 },
];

笔记:

  • 詹姆斯来自 james@email.net(第一个元素)
  • admin 和 secretary 分别来自 admin@email.com 和 secretary@email.uk(第二个元素)
  • 工作人员来自 staff@email.us(第 3 个元素)等等。
  • 作为对象键的电子邮件是动态的,这意味着它可以是“johndoe@email.co.uk”、“mary@email.net”等。

我已经尝试过,但还没有成功:

for (let i = 0; i < data.length; i++) {
  let keys = Object.keys(data[i]);
  console.log(`key-${i+1} :`, keys); // [ 'date', 'count', 'admin@email.com', 'secretary@email.uk' ]
  
  let emails = keys.filter(index => index.includes("@"));
  console.log(`email-${i+1} :`, emails); // [ 'admin@email.com', 'secretary@email.uk' ]
  
  let nameList = [];
  for (let i = 0; i < emails.length; i++) {
    let name = emails[i].split("@")[0];
    nameList.push(name);
  }
  console.log(`name-${i+1} :`, nameList); // [ 'admin', 'secretary' ]
}

提前致谢。

您可以创建一个函数,该函数在@处拆分对象键的键,并使用Object.fromEntries()创建一个新对象。

这是一个片段:

 const data = [{date:"17/03/2022",count:2,"james@email.net":2},{date:"17/05/2022",count:2,"admin@email.com":1,"secretary@email.uk":1},{date:"17/07/2022",count:7,"staff@email.us":7}]; const converter = o => Object.fromEntries( Object.entries(o).map(([k, v]) => [k.split("@")[0], v]) ) console.log( data.map(converter) )

如果不支持Object.fromEntries() ,您可以使用一个简单的循环遍历数组,然后每个对象创建新对象,如下所示:

const output = []

for (const o of data) {
  const updated = {}
  
  for (const key in o) {
    updated[key.split("@")[0]] = o[key]
  }
  
  output.push(updated)
}

尽可能简单地尝试这个:

 let data = [{ "date": "17/03/2022", "count": 2, "james@email.net": 2 }, { "date": "17/05/2022", "count": 2, "admin@email.com": 1, "secretary@email.uk": 1 }, { "date": "17/07/2022", "count": 7, "staff@email.us": 7 }, ]; data.map((el, i) => { Object.keys(el).map(e => { if(e.includes('@')){ data[i][e.slice(0, e.indexOf('@'))] = data[i][e]; delete data[i][e]; } }) }); console.log(data);

你能试试用这个吗?

for (let i = 0; i < data.length; i++) {
  let element = data[i];
  let keys = Object.keys(element);

  let emails = keys.filter(index => index.includes("@"));
  for (let j = 0; j < emails.length; j++) {
    let name = emails[j].split("@")[0];
    let value = element[emails[j]];
    Object.defineProperty(element, name, { value });
    delete element[emails[j]];
  }
}

console.log(data);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM