Что лучший способ является (самым эффективным) для поворачивания всех ключей объекта к нижнему регистру?

Я придумал

function keysToLowerCase (obj) {
  var keys = Object.keys(obj);
  var n = keys.length;
  while (n--) {
    var key = keys[n]; // "cache" it, for less lookups to the array
    if (key !== key.toLowerCase()) { // might already be in its lower case version
        obj[key.toLowerCase()] = obj[key] // swap the value to a new lower case key
        delete obj[key] // delete the old key
    }
  }
  return (obj);
}

Но я не уверен, как v8 будет вести себя с этим, например, он действительно удалит другие ключи, или он только удалит ссылки, и сборщик "мусора" укусит меня позже?

Кроме того, я создал эти тесты, я надеюсь, что Вы могли добавить свой ответ там, таким образом, мы видели, как они совпадают.

РЕДАКТИРОВАНИЕ 1: По-видимому, согласно тестам, это быстрее, если мы не проверим, находится ли ключ уже в нижнем регистре, но быть быстрее в стороне, это создаст больше помехи путем игнорирования этого и просто создания новых ключей нижнего регистра? Сборщик "мусора" будет доволен этим?

59
задан 22 September 2012 в 04:11

3 ответа

var aa = {ID:1,NAME:'Guvaliour'};
var bb= {};
var cc = Object.keys(aa);
cc.forEach(element=>{
 bb[element.toLowerCase()]=aa[element];
});
cosole.log(bb)
0
ответ дан 1 November 2019 в 11:45

Это - то, как я делаю это. Мой вход может быть чем-либо, и он дисквалифицирует через вложенные объекты, а также массивы объектов.

const fixKeys = input => Array.isArray(input)
  ? input.map(fixKeys)
  : typeof input === 'object'
  ? Object.keys(input).reduce((acc, elem) => {
      acc[elem.toLowerCase()] = fixKeys(input[elem])
      return acc
    }, {})
  : input

протестированное мокко использования

const { expect } = require('chai')

const fixKeys = require('../../../src/utils/fixKeys')

describe('utils/fixKeys', () => {
  const original = {
    Some: 'data',
    With: {
      Nested: 'data'
    },
    And: [
      'an',
      'array',
      'of',
      'strings'
    ],
    AsWellAs: [
      { An: 'array of objects' }
    ]
  }

  const expected = {
    some: 'data',
    with: {
      nested: 'data'
    },
    and: [
      'an',
      'array',
      'of',
      'strings'
    ],
    aswellas: [{ an: 'array of objects' }]
  }

  let result

  before(() => {
    result = fixKeys(original)
  })

  it('left the original untouched', () => {
    expect(original).not.to.deep.equal(expected)
  })

  it('fixed the keys', () => {
    expect(result).to.deep.equal(expected)
  })
})
0
ответ дан 1 November 2019 в 11:45

Используя Object.fromEntries (ES.next)

Собственное и неизменное решение с помощью нового Object.fromEntries метод:


const newObj = Object.fromEntries(
  Object.entries(obj).map(([k, v]) => [k.toLowerCase(), v])
);

, Пока та функция не становится широко доступной, Вы могли определить ее сами со следующей полизаливкой ES.next:

Object.fromEntries = arr => Object.assign({}, ...Array.from(arr, ([k, v]) => ({[k]: v}) ));

А хорошая вещь состоит в том, что этот метод делает противоположность Object.entries , поэтому теперь можно пойти назад и вперед между объектным представлением и представлением в виде массива.

7
ответ дан 1 November 2019 в 11:45

Другие вопросы по тегам:

Похожие вопросы: