Я придумал
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: По-видимому, согласно тестам, это быстрее, если мы не проверим, находится ли ключ уже в нижнем регистре, но быть быстрее в стороне, это создаст больше помехи путем игнорирования этого и просто создания новых ключей нижнего регистра? Сборщик "мусора" будет доволен этим?
var aa = {ID:1,NAME:'Guvaliour'};
var bb= {};
var cc = Object.keys(aa);
cc.forEach(element=>{
bb[element.toLowerCase()]=aa[element];
});
cosole.log(bb)
Это - то, как я делаю это. Мой вход может быть чем-либо, и он дисквалифицирует через вложенные объекты, а также массивы объектов.
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)
})
})
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
, поэтому теперь можно пойти назад и вперед между объектным представлением и представлением в виде массива.