Как убрать пробелы из ключей объекта?[для ... в] [keys.forEach] [уменьшить] - PullRequest
0 голосов
/ 25 марта 2019

Моя цель: убрать пробелы из ключей объектов.

Например, у меня есть такие записи:

const records = [
    { 'Red Blue': true, 'Orange Strawberry': true, 'Abc Xyz': true },
    { 'Blue Red': true, 'Abc Abc': true, 'Abc Xyz': true },
    { 'Yellow Green': true, 'Apple Banana': true, 'Abc Xyz': true },
]

И нужно удалить пробелы каждого ключа каждой записи, чтобы они были такими:

[
    { 'RedBlue': true, 'OrangeStrawberry': true, 'AbcXyz': true },
    { 'BlueRed': true, 'AbcAbc': true, 'AbcXyz': true },
    { 'YellowGreen': true, 'AppleBanana': true, 'AbcXyz': true },
]

Вопросы:

  1. Я делаю правильно?
  2. Есть ли другое решение, которое может решить мою задачу?

Я написал 3 решения: с for in, с Object.keys().forEach и с reduce.

_

Вот 3 моих решения:

const records = [
  { "Red Blue": true, "Orange Strawberry": true, "Abc Xyz": true },
  { "Blue Red": true, "Abc Abc": true, "Abc Xyz": true },
  { "Yellow Green": true, "Apple Banana": true, "Abc Xyz": true },
];

/* 1) for...in */
console.time && console.time('solution 1');
const solution1 = records.map(record => {
  const newRecord = {};
  for (const key in record) {
    newRecord[key.replace(/\s/g, "")] = record[key];
  }
  return newRecord;
});
console.timeEnd && console.timeEnd('solution 1');

/* 2) Object.keys(records).forEach */
console.time && console.time('solution 2');
const solution2 = records.map(parent => {
  const newParent = {};
  Object.keys(parent).forEach(key => {
    newParent[key.replace(/\s/g, "")] = parent[key];
  });
  return newParent;
});
console.timeEnd && console.timeEnd('solution 2');

/* 3) reduce */
console.time && console.time('solution 3');
const solution3 = records.map(parent => {
  return Object.keys(parent).reduce((acc, key) => ({
    ...acc,
    [key.replace(/\s/g, "")]: parent[key],
  }), {});
});
console.timeEnd && console.timeEnd('solution 3');

/* All solutions has the same result */
console.log({
  solution1,
  solution2,
  solution3,
});
.as-console-wrapper { max-height: 100% !important; top: 0; }

ОБНОВЛЕНО: добавлено console.time для измерения времени выполнения каждого решения.

Ответы [ 4 ]

2 голосов
/ 25 марта 2019

Такие вопросы, как «что лучше», являются субъективными, и ответ обычно таков: «все, что подходит вам лучше всего, если оно помогает». Тем не менее, существует общее мнение, что разделение кода на части многократного использования в долгосрочной перспективе будет чище. В вашем конкретном примере «изменить ключи какого-либо объекта» и «удалить пробелы» - это две свободно связанные части, каждая из которых может быть полезна сама по себе, поэтому «лучше» кодировать их как таковые, например:

function mapKeys(obj, fn) {
    let res = {};

    for (let [k, v] of Object.entries(obj))
        res[fn(k)] = v;

    return res;
}

и

let removeSpaces = x => x.replace(/\s+/g, '');

Затем, чтобы решить проблему, вы просто объединяете обе части вместе:

newRecords = records.map(rec => mapKeys(rec, removeSpaces))
1 голос
/ 25 марта 2019

const records = [
  { "Red Blue": true, "Orange Strawberry": true, "Abc Xyz": true, hello: 'world' },
  { "Blue Red": true, "Abc Abc": true, "Abc Xyz": true },
  { "Yellow Green": true, "Apple Banana": true, "Abc Xyz": true },
]

console.time && console.time('Execution time');
const newRecords = records.map(r => {
  const rKeys = Object.keys(r)
  let refObj = {}
  
  rKeys.forEach(k => {
    let tempKey = k
    
    if (k.indexOf(' ') !== -1) tempKey = k.replace(' ', '')
    
    refObj[tempKey] = r[k]
  })
  
  return refObj
});
console.timeEnd && console.timeEnd('Execution time');

console.log(newRecords)
1 голос
/ 25 марта 2019

const records = [
  { 'Red Blue': true, 'Orange Strawberry': true, 'Abc Xyz': true },
  { 'Blue Red': true, 'Abc Abc': true, 'Abc Xyz': true },
  { 'Yellow Green': true, 'Apple Banana': true, 'Abc Xyz': true }
];

console.time && console.time('Execution time');
for (let record of records) {
  for (let key in record) {
    record[key.split(' ').join('')] = record[key];
    if (key.split(' ').join('') !== key) delete record[key];
  }
}
console.timeEnd && console.timeEnd('Execution time');

console.log(records);
0 голосов
/ 26 марта 2019

Вы можете использовать некоторые регулярные выражения для удаления пробелов:

const records = [
    { 'Red Blue': true, 'Orange Strawberry': true, 'Abc Xyz': true },
    { 'Blue Red': true, 'Abc Abc': true, 'Abc Xyz': true },
    { 'Yellow Green': true, 'Apple Banana': true, 'Abc Xyz': true },
]

const noSpaces = JSON.parse(JSON.stringify(records).replace(/\s(?=\w.+":)/gm, ''))

console.log(noSpaces)
...