Как изменить только первый экземпляр ключа в объекте - PullRequest
3 голосов
/ 21 апреля 2020

Итак, я нашел несколько примеров того, как найти первый экземпляр ключа в объекте, но я не смог найти, как найти и изменить только имя этого первого вхождения.

Чтобы уточнить, у меня в настоящее время есть функция, которая перебирает объект и изменяет имена свойств, если они перечислены для изменения. Например, 'first_name' будет 'firstName', 'customer' будет 'индивидуальный' и т. Д. c.

В некоторых местах есть также свойство 'id', но я хочу только изменить 'id 'to' customerId 'для первого экземпляра, где' id 'найден.

По сути, я хочу, чтобы этот объект

{
  "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' , но я хочу, чтобы это произошло только для первого идентификатора, найденного в объекте. Пока моя функция такова:

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),
    ])
  );
};

Где keyChanges - это переменная, в которой перечислены новые имена, на которые следует изменить, если они найдены.

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

Мои попытки решить эту проблему к сожалению, всегда влияет на другие экземпляры id. Любые указатели будут искренне оценены:)

1 Ответ

2 голосов
/ 21 апреля 2020

Я предполагаю, что у вас есть что-то вроде картографа, который просматривает каждый элемент вашего массива объектов. Что вам нужно сделать, это добавить фрагмент кода, который будет выполняться только для первого элемента в вашей функции карты.

Например:

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