Как переименовать ключи объекта внутри массива - PullRequest
18 голосов
/ 06 августа 2020

У меня есть массив таких объектов:

const customers = [
  {
    customer_name: 'Negan', 
    customer_age: 45, 
    customer_weapon: 'Bat',
    customer_email: 'negan@sanctuary.com',
    customer_city: 'Washington' 
  },
  {
    customer_name: 'Daryl', 
    customer_age: 41, 
    customer_weapon: 'Crossbow',
    customer_email: 'daryl.dixon@kickass.com',
    customer_city: 'Atlanta' 
  },
  {
    customer_name: 'Rick', 
    customer_age: 45, 
    customer_weapon: 'Magnum 357',
    customer_email: 'rick@alexandria.com',
    customer_city: 'King County' 
  },
]

, и я хочу заменить все ключи внутри объектов этими ключами:

const newKeys = [
   'firstname',
   'age',
   'weapon',
   'email',
   'city'
]

Как лучше всего сделать этот? Будем признательны за пример!

Ответы [ 11 ]

12 голосов
/ 06 августа 2020

Вы можете использовать Object.values() для получения значений, а затем array.reduce() для создания нового объекта:

const customers = [
  {
    customer_name: 'Negan', 
    customer_age: 45, 
    customer_weapon: 'Bat',
    customer_email: 'negan@sanctuary.com',
    customer_city: 'Washington' 
  },
  {
    customer_name: 'Daryl', 
    customer_age: 41, 
    customer_weapon: 'Crossbow',
    customer_email: 'daryl.dixon@kickass.com',
    customer_city: 'Atlanta' 
  },
  {
    customer_name: 'Rick', 
    customer_age: 45, 
    customer_weapon: 'Magnum 357',
    customer_email: 'rick@alexandria.com',
    customer_city: 'King County' 
  },
];

const newKeys = [
   'firstname',
   'age',
   'weapon',
   'email',
   'city'
];

let result = customers.map(obj => 
    Object.values(obj).reduce((acc, cur, i) => { 
       acc[newKeys[i]] = cur; 
       return acc; }, {}));

console.log(result);
4 голосов
/ 06 августа 2020

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

Если объект клиента удовлетворяет ключу 1: 1 mapping, go для подхода, аналогичного этому, который отображает список объектов клиента, создавая новый объект клиента на каждом шаге итерации, сокращая список ключевых кортежей с каждым кортежем, содержащим старый и новый ключ ...

function createNewCustomerFromOldOneViaBoundConfig(customer) {
  return Object.entries(this).reduce((newCustomer, [key, newKey]) => {

    newCustomer[newKey] = customer[key];
    return newCustomer;

  }, {});
};


const customerKeyReplacementMap = {
  customer_name: 'firstname',
  customer_age: 'age',
  customer_weapon: 'weapon',
  customer_email: 'email',
  customer_city: 'city'
};

const customers = [{

  customer_name: 'Negan', 
  customer_age: 45, 
  customer_weapon: 'Bat',
  customer_email: 'negan@sanctuary.com',
  customer_city: 'Washington' 
}, {
  customer_name: 'Daryl', 
  customer_age: 41, 
  customer_weapon: 'Crossbow',
  customer_email: 'daryl.dixon@kickass.com',
  customer_city: 'Atlanta' 
}, {
  customer_name: 'Rick', 
  customer_age: 45, 
  customer_weapon: 'Magnum 357',
  customer_email: 'rick@alexandria.com',
  customer_city: 'King County'

}].map(createNewCustomerFromOldOneViaBoundConfig, customerKeyReplacementMap);


console.log('customers : ', customers);
.as-console-wrapper { min-height: 100%!important; top: 0; }

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

Этот случай также доказывает, что любой подход, основанный только на списке заменяющих ключей, действительно ограничен только одним типом клиентов порядок ключей (и структура) объекта ...

function createNewCustomerFromOldOneAndMutateKeysViaBoundConfig(oldCustomer) {
  return Object.entries(this).reduce((customer, [oldKey, key]) => {

    customer[key] = customer[oldKey];
    delete customer[oldKey];

    return customer;

  }, Object.assign({}, oldCustomer));
};


const customerKeyReplacementMap = { 
  customer_name: 'firstname',
  customer_age: 'age',
  customer_weapon: 'weapon',
  customer_email: 'email',
  customer_city: 'city'
};

const customers = [{

  additional_key_1: 'FOO',

  customer_name: 'Negan', 
  customer_age: 45,
  
  additional_key_2: 'BAR',

  customer_weapon: 'Bat',
  customer_email: 'negan@sanctuary.com',
  customer_city: 'Washington' 
}, {
  additional_key_1: 'BAZ',

  customer_name: 'Daryl', 
  customer_age: 41,

  additional_key_2: 'BIZ',

  customer_weapon: 'Crossbow',
  customer_email: 'daryl.dixon@kickass.com',
  customer_city: 'Atlanta' 
}, {
  additional_key_1: 'FOOBAR',

  customer_name: 'Rick', 
  customer_age: 45,

  additional_key_2: 'BAZBIZ',

  customer_weapon: 'Magnum 357',
  customer_email: 'rick@alexandria.com',
  customer_city: 'King County'

}].map(
  createNewCustomerFromOldOneAndMutateKeysViaBoundConfig,
  customerKeyReplacementMap
);


console.log('customers : ', customers);
.as-console-wrapper { min-height: 100%!important; top: 0; }
3 голосов
/ 06 августа 2020

Можно сделать и так.

const customers = [
    {
        customer_name: 'Negan',
        customer_age: 45,
        customer_weapon: 'Bat',
        customer_email: 'negan@sanctuary.com',
        customer_city: 'Washington'
    },
    {
        customer_name: 'Daryl',
        customer_age: 41,
        customer_weapon: 'Crossbow',
        customer_email: 'daryl.dixon@kickass.com',
        customer_city: 'Atlanta'
    },
    {
        customer_name: 'Rick',
        customer_age: 45,
        customer_weapon: 'Magnum 357',
        customer_email: 'rick@alexandria.com',
        customer_city: 'King County'
    },
]

const newKeys = [
    'firstname',
    'age',
    'weapon',
    'email',
    'city'
]

let newArr = []

customers.map(c => {
    let obj = {}
    Object.values(c).map((v,i)=>{
        obj[newKeys[i]] = v;
    })
    newArr.push(obj)
})

console.log(newArr)
3 голосов
/ 06 августа 2020

Можно сделать простую карту. Таким образом, порядок ключей не имеет значения.

const customers = [{
    customer_name: 'Negan',
    customer_age: 45,
    customer_weapon: 'Bat',
    customer_email: 'negan@sanctuary.com',
    customer_city: 'Washington'
  },
  {
    customer_name: 'Daryl',
    customer_age: 41,
    customer_weapon: 'Crossbow',
    customer_email: 'daryl.dixon@kickass.com',
    customer_city: 'Atlanta'
  },
  {
    customer_name: 'Rick',
    customer_age: 45,
    customer_weapon: 'Magnum 357',
    customer_email: 'rick@alexandria.com',
    customer_city: 'King County'
  },
]

var updated = customers.map(customer => {
  const {
    customer_name,
    customer_age,
    customer_weapon,
    customer_email,
    customer_city
  } = customer;

  return {
    firstname: customer_name,
    age: customer_age,
    weapon: customer_weapon,
    email: customer_email,
    city: customer_city
  }
});

console.log(updated);
3 голосов
/ 06 августа 2020

Вы можете попробовать использовать for...of и for...in l oop:

const customers = [
  {
    customer_name: 'Negan', 
    customer_age: 45, 
    customer_weapon: 'Bat',
    customer_email: 'negan@sanctuary.com',
    customer_city: 'Washington' 
  },
  {
    customer_name: 'Daryl', 
    customer_age: 41, 
    customer_weapon: 'Crossbow',
    customer_email: 'daryl.dixon@kickass.com',
    customer_city: 'Atlanta' 
  },
  {
    customer_name: 'Rick', 
    customer_age: 45, 
    customer_weapon: 'Magnum 357',
    customer_email: 'rick@alexandria.com',
    customer_city: 'King County' 
  },
];
const newKeys = [
   'firstname',
   'age',
   'weapon',
   'email',
   'city'
]
for(var o of customers){
  var index = 0;
  for(var k in o){
    delete Object.assign(o, {[newKeys[index]]: o[k] })[k];
    index++;
  }
}
console.log(customers);
3 голосов
/ 06 августа 2020

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

const customers = [
  { customer_name: 'Negan', customer_age: 45, customer_weapon: 'Bat', customer_email: 'negan@sanctuary.com', customer_city: 'Washington' },
  { customer_name: 'Daryl', customer_age: 41, customer_weapon: 'Crossbow', customer_email: 'daryl.dixon@kickass.com', customer_city: 'Atlanta' },
  { customer_name: 'Rick', customer_age: 45, customer_weapon: 'Magnum 357', customer_email: 'rick@alexandria.com', customer_city: 'King County' },
];

const newKeys = [ 'firstname', 'age', 'weapon', 'email', 'city' ];

const res = customers.map(obj => {
  const newObj = {};
  Object.keys(obj).forEach((k, i) => newObj[newKeys[i]] = obj[k]);
  return newObj;
});

console.log(res);
.as-console-wrapper { max-height: 100% !important; top: 0; }

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

Для этого просто замените newKeys на объект, как показано ниже:

const newKeys = { 
  customer_name: 'firstname', 
  customer_age: 'age', 
  customer_weapon: 'weapon',
  customer_email: 'email',
  customer_city: 'city'
};

и измените код в методе .map() в приведенном выше фрагменте кода на

const res = customers.map(obj => {
  const newObj = {};
  Object.keys(obj).forEach(k => newObj[newKeys[k]] = obj[k]);
  return newObj;
});
3 голосов
/ 06 августа 2020

Вы можете перебирать объекты, а затем изменять keys каждого свойства на значения из newKeys:

const customers = [
  {
    customer_name: 'Negan', 
    customer_age: 45, 
    customer_weapon: 'Bat',
    customer_email: 'negan@sanctuary.com',
    customer_city: 'Washington' 
  },
  {
    customer_name: 'Daryl', 
    customer_age: 41, 
    customer_weapon: 'Crossbow',
    customer_email: 'daryl.dixon@kickass.com',
    customer_city: 'Atlanta' 
  },
  {
    customer_name: 'Rick', 
    customer_age: 45, 
    customer_weapon: 'Magnum 357',
    customer_email: 'rick@alexandria.com',
    customer_city: 'King County' 
  },
]

const newKeys = [
   'firstname',
   'age',
   'weapon',
   'email',
   'city'
]

for (let i = 0; i < customers.length; i++) {
     let customer = customers[i];
     let j = 0;
     for(let p in customer){
          customer[newKeys[j++]] = customer[p];
          delete customer[p];
     }
}

console.log(customers);
2 голосов
/ 06 августа 2020

Использование деструктуризации с переименованием

const update = (arr) =>
  arr.map(
    ({
      customer_name: firstname,
      customer_age: age,
      customer_weapon: weapon,
      customer_email: email,
      customer_city: city,
    }) => ({
      firstname,
      age,
      weapon,
      email,
      city,
    })
  );

const customers = [
  {
    customer_name: "Negan",
    customer_age: 45,
    customer_weapon: "Bat",
    customer_email: "negan@sanctuary.com",
    customer_city: "Washington",
  },
  {
    customer_name: "Daryl",
    customer_age: 41,
    customer_weapon: "Crossbow",
    customer_email: "daryl.dixon@kickass.com",
    customer_city: "Atlanta",
  },
  {
    customer_name: "Rick",
    customer_age: 45,
    customer_weapon: "Magnum 357",
    customer_email: "rick@alexandria.com",
    customer_city: "King County",
  },
];

const newKeys = ["firstname", "age", "weapon", "email", "city"];

console.log(update(customers));
2 голосов
/ 06 августа 2020

Я написал этот фрагмент кода, чтобы удовлетворить все мои потребности в изменении имени свойства объекта.

deepRenameKeys = function(array: any[], shape: Object): any[] {
    if (!array || !array.length || !shape) return;
    return array.map(item => {
        let _obj = {};
        for (const key in shape) {
            if (shape.hasOwnProperty(key)) {
                _obj[key] = shape[key].split('.').length ?
                    shape[key].split('.').reduce((a, b) => a[b], item) :
                    item[shape[key]];
            }
        }
        return _obj;
    })
}

Обратите внимание, что вы также можете использовать точечную нотацию:

const customers = [
    {
        customer_name: 'Negan',
        customer_age: 45,
        customer_weapon: {
            kind: 'Bat',
            type: 'melee'
        },
        customer_email: 'negan@sanctuary.com',
        customer_city: 'Washington'
    },
    {
        customer_name: 'Daryl',
        customer_age: 41,
        customer_weapon: {
            kind: 'Crossbow',
            type: 'range'
        },
        customer_email: 'daryl.dixon@kickass.com',
        customer_city: 'Atlanta'
    },
    {
        customer_name: 'Rick',
        customer_age: 45,
        customer_weapon: {
            kind: 'Magnum 357',
            type: 'range'
        },
        customer_email: 'rick@alexandria.com',
        customer_city: 'King County'
    }
];

const newKeys = [
    'firstname': 'customer_name',
    'age': 'customer_age',
    'weapon': 'customer_weapon.kind',
    'weaponType': 'customer_weapon.type'
    'email': 'customer_email',
    'city': 'customer_city'
];

let newData = deepRenameKeys(customers, newKeys);
2 голосов
/ 06 августа 2020

Два шага:

  1. Создайте новый ключ со значением, скопированным из существующего ключа
  2. Удалите ключ, из которого вы только что скопировали значение

Рабочий пример:

let myCustomer = {
  customer_name: 'Negan', 
  customer_age: 45 
}

myCustomer.firstname = myCustomer.customer_name;
myCustomer.age = myCustomer.customer_age;

delete myCustomer.customer_name;
delete myCustomer.customer_age;

console.log(myCustomer);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...