【问题标题】:Javascript - Change name of all object keys in nested arraysJavascript - 更改嵌套数组中所有对象键的名称
【发布时间】:2021-02-12 20:51:31
【问题描述】:

这是我得到的数组:

const packages = [
  {
    id: '641a1690-6c8b-4ada-ae97-8d82cc4fe7a3',
    name: 'com.sample',
    children: {
      id: 'd7384f60-e4ab-4a86-8e2e-0f66cc32f',
      name: 'child.computer.com',
      children: { id: 'e4ab-4a86-0f66cc32f560', name: 'child.com' }
    }
  },
  { id: 'd7384f60-e4ab-4a86-8e2e-0f66cc32f560', name: 'computer.com' },
  { id: 'ca7f972e-64ee-4cb0-80b9-1036fac69d32', name: 'java.util' }
];

所以,它是一个对象数组,每个对象都可以有子对象,子对象又可能有id、name,可能还有子对象(子对象是可选的),依此类推,可以嵌套X次。 我想更改键名,将 id 更改为键,将名称更改为标题,并且孩子将仍然是孩子。所以,我的问题是我不知道如何更改子项内部的键,我只是更改第一级,仅此而已.. 应该是这样的:

{
    key: '641a1690-6c8b-4ada-ae97-8d82cc4fe7a3',
    title: 'com.sample',
    children: {
      key: 'd7384f60-e4ab-4a86-8e2e-0f66cc32f',
      title: 'child.computer.com',
      children: { key: 'e4ab-4a86-0f66cc32f560', title: 'child.com' }
    }   
}

【问题讨论】:

  • 你有没有尝试过?尝试在数组中读取map

标签: javascript reactjs web frontend


【解决方案1】:

您可以使用递归来做到这一点。

检查来自Object#entries() 调用的[key-value] 对的value 是否是object

如果是这样,请再次递归地调用transformObj 函数以获取该值。否则按原样返回值。

最后使用Object#fromEntries将[key-value]对数组转换回对象:

const packages = [{ id: '641a1690-6c8b-4ada-ae97-8d82cc4fe7a3', name: 'com.sample', children: { id: 'd7384f60-e4ab-4a86-8e2e-0f66cc32f', name: 'child.computer.com', children: { id: 'e4ab-4a86-0f66cc32f560', name: 'child.com' }}}, { id: 'd7384f60-e4ab-4a86-8e2e-0f66cc32f560', name: 'computer.com' }, { id: 'ca7f972e-64ee-4cb0-80b9-1036fac69d32', name: 'java.util' }];
const replacer = { "id": "key", "name" :"title"};
const transformObj = (obj) => {
  if(obj && Object.getPrototypeOf(obj) === Object.prototype){
    return Object.fromEntries(
    Object.entries(obj)
          .map(([k, v]) => [replacer[k] || k, transformObj(v)])
    );
  }
  //Base case, if not an Object literal return value as is
  return obj;
}
console.log(packages.map(o => transformObj(o)));

【讨论】:

  • 为什么需要 if(obj && Object.getPrototypeOf(obj) === Object.prototype) 检查?
  • @RichardRublev 检查该值是否为嵌套对象,如果是,我们还需要递归转换嵌套对象。如果是stringnumber,那么我们就不用费心转换了。
【解决方案2】:

您可以尝试遍历数组中的每个对象并递归地遍历其键。然后您可以更改您想要更改的键并进一步迭代子键。

const packages = [{id: '641a1690-6c8b-4ada-ae97-8d82cc4fe7a3',name:'com.sample',children: {id: 'd7384f60-e4ab-4a86-8e2e-0f66cc32f',name: 'child.computer.com',children: { id: 'e4ab-4a86-0f66cc32f560', name: 'child.com' }}},{ id: 'd7384f60-e4ab-4a86-8e2e-0f66cc32f560', name: 'computer.com' },{ id: 'ca7f972e-64ee-4cb0-80b9-1036fac69d32', name: 'java.util' }];

const renameNestedObjects = (obj) => {
    Object.keys(obj).forEach((key, index) => {
    if (key == "id") {
      obj["key"] = obj["id"];
      delete obj["id"];
    }
    if (key == "name") {
      obj["title"] = obj["name"];
      delete obj["name"];
    }
    if (key == "children") {
        renameNestedObjects(obj["children"]);
    }
  });
}

console.log(packages);
packages.forEach(obj => { renameNestedObjects(obj); });
console.log(packages);

【讨论】:

  • 这也有效,虽然我选择了第一个答案,因为它更有活力,但非常感谢!
猜你喜欢
  • 2021-12-29
  • 2021-11-28
  • 2021-09-28
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2021-07-03
相关资源
最近更新 更多