首页 > 解决方案 > 如何仅更改对象中键的第一个实例

问题描述

因此,我找到了许多关于如何在对象中找到键的第一个实例的示例,但我无法找到如何找到并仅更改第一个出现的名称。

澄清一下,我目前有一个函数可以循环遍历一个对象并更改属性名称,如果它们被列为要更改的话。例如,“first_name”是“firstName”,“customer”是“individual”等。

在许多地方还有属性“id”,但我只想在找到“id”的第一个实例中将“id”更改为“customerId”。

基本上,我想要这个对象

{
  "id": "12345",
  "location": {
    "id": "400",
    "name": "New York",
  },
 "customer": {
   "id": "2222",
   "first_name": "Bob",
   "last_name": "Jones"
 },
  "address": [
    {
      "line1": "123 Sesame Street",
      "city": "Springfield",
      "country": "US",
      "state": "NY"
     }
  ],
}

看起来像

{
  "customerId": "12345",
  "location": {
    "id": "400",
    "name": "New York",
  },
 "individual": {
   "id": "2222",
   "firstName": "Bob",
   "lastName": "Jones"
 },
  "address": [
    {
      "line1": "123 Sesame Street",
      "city": "Springfield",
      "country": "US",
      "state": "NY"
     }
  ],
}

目前我的函数正在将“id”的所有实例更改为“customerId”,但我只希望它发生在对象中找到的第一个“id”。到目前为止,我的功能是,

const restructure = obj => {
  Object.fromEntries = arr => Object.assign({}, ...Array.from(arr, ([k, v]) => ({ [k]: v })));
  if (typeof obj !== 'object' || obj === null) {
    return obj;
  }
  if (Array.isArray(obj)) {
    return obj.map(restructure);
  }
  return Object.fromEntries(
    Object.entries(obj).map(([key, val]) => [
      keyChanges[key] || key,
      restructure(val),
    ])
  );
};

WherekeyChanges是一个变量,列出了如果找到新名称应更改的内容。

const keyChanges = {
  id: 'customerId',
  customer: 'individual',
  first_name: 'firstName',
  middle_name: 'middleName',
  last_name: 'lastName',
};

不幸的是,我解决这个问题的尝试总是最终影响到“id”的其他实例。任何指针将不胜感激:)

标签: javascriptnode.jsjsonjavascript-objects

解决方案


我假设你有一个类似映射器的东西,它会遍历你的对象数组中的每一个项目。您需要做的是添加代码块,该代码块只会为您的地图函数中的第一项执行。

例如:

myArrayOfObjects.map((item, index) => {
  if(index == 0) {
    <here goes your function to change the key from "id" to "customerId">
  }
})

推荐阅读