Учитывая EcmaScript Section 12.6.4:
Свойства перечисляемого объекта могут быть удалены во время перечисления. Если свойство, которое еще не было посещено во время перечисления, будет удалено, оно не будет посещено.
Однако, проверьте этот случай:
class Lead {
MAPPINGS = [
[
/Medication_Types_(\d+)/,
(data, key, acc, i) => {
const values = Object.keys(data)
.filter( key => /Medication_Types_(\d+)/.test(key ))
.map(key => data[key]);
console.log('the values: ', values);
acc['Medication_Types'] = values;
Object.keys(data).forEach( key => {
if( /Medication_Types_(\d+)/.test(key)) delete data[key];
})
return i;
}
]
]
format(data) {
const copy = JSON.parse(JSON.stringify(data));
let mapping = false;
let i = 1;
const result = Object.keys(copy).reduce((acc, key) => {
mapping = false;
this.MAPPINGS.forEach( (mapping) => {
if(mapping[0].test(key)){
mapping[1](copy, key, acc, i);
mapping = true;
}
});
if(!mapping){
acc[key] = copy[key];
}
return acc;
}, {});
return result;
}
}
const data = {
"Gender" : "Male",
"Medication_Types_1" : "A",
"Medication_Types_2" : "B",
"First_Name" : "bob"
}
const lead = new Lead();
const result = lead.format(data);
console.log('the result: ', result);
Это выводит:
the values: [ 'A', 'B' ]
the values: []
the result: {
Gender: 'Male',
Medication_Types: [],
Medication_Types_1: undefined,
Medication_Types_2: undefined,
First_Name: 'bob'
}
Если бы ключи были действительно удалены, то «значения» не были бы напечатаны во второй раз, и вместо этого я бы получил (и то, что я хочу) это:
{
Gender: 'Male',
Medication_Types: ['A', 'B'],
First_Name: 'bob'
}
Похоже, что delete
может удалять ключ, но не из текущей итерации, но EcmaScript заявляет, что он удалит из текущей итерации! Что не так и как я могу это исправить?