Вы присваиваете ссылки на объекты , поэтому все три элемента criteriaArray
указывают на одинаковые экземпляры criteriaLevel1
и criteriaLevel2
.
У вас есть несколько вариантов для поддержки одного и того же шаблона:
criteriaArray[ix][0] = {...criteriaLevel1, childItems: []};
criteriaArray[ix][0].childItems[0] = {...criteriaLevel2, childItems: []};
const criteriaLevel1 = {
fieldName: 'Criteria name',
fieldValue: 'Crit-Level-1',
childItems: []
};
const criteriaLevel2 = {
fieldName: 'Criteria name',
fieldValue: 'Crit-Level-2',
childItems: []
};
const itemsABC = [
'item AAA',
'item BBB',
'item CCC'
];
const criteriaArray = [];
let ix = 0;
itemsABC.forEach(item => {
console.log('item: ' + item);
criteriaArray[ix] = [];
criteriaArray[ix][0] = {...criteriaLevel1, childItems: []};
criteriaArray[ix][0].childItems[0] = {...criteriaLevel2, childItems: []};
criteriaArray[ix][0].childItems[0].childItems[0] = {
fieldName: 'name',
fieldValue: item + '-' + ix
};
ix++;
});
for (let i = 0; i < 3; i++) {
console.log('ix: ' + i);
for (const itemA of criteriaArray[i]) {
console.log('a: ' + itemA.fieldName + ' - ' + itemA.fieldValue);
for (const itemB of itemA.childItems) {
console.log('b: ' + itemB.fieldName + ' - ' + itemB.fieldValue);
for (const itemC of itemB.childItems) {
console.log('c: ' + itemC.fieldName + ' - ' + itemC.fieldValue);
}
}
}
}
criteriaArray[ix][0] = Object.assign({}, criteriaLevel1, {childItems: []});
criteriaArray[ix][0].childItems[0] = Object.assign({}, criteriaLevel2, {childItems: []});
const criteriaLevel1 = {
fieldName: 'Criteria name',
fieldValue: 'Crit-Level-1',
childItems: []
};
const criteriaLevel2 = {
fieldName: 'Criteria name',
fieldValue: 'Crit-Level-2',
childItems: []
};
const itemsABC = [
'item AAA',
'item BBB',
'item CCC'
];
const criteriaArray = [];
let ix = 0;
itemsABC.forEach(item => {
console.log('item: ' + item);
criteriaArray[ix] = [];
criteriaArray[ix][0] = Object.assign({}, criteriaLevel1, {childItems: []});
criteriaArray[ix][0].childItems[0] = Object.assign({}, criteriaLevel2, {childItems: []});
criteriaArray[ix][0].childItems[0].childItems[0] = {
fieldName: 'name',
fieldValue: item + '-' + ix
};
ix++;
});
for (let i = 0; i < 3; i++) {
console.log('ix: ' + i);
for (const itemA of criteriaArray[i]) {
console.log('a: ' + itemA.fieldName + ' - ' + itemA.fieldValue);
for (const itemB of itemA.childItems) {
console.log('b: ' + itemB.fieldName + ' - ' + itemB.fieldValue);
for (const itemC of itemB.childItems) {
console.log('c: ' + itemC.fieldName + ' - ' + itemC.fieldValue);
}
}
}
}
Обратите внимание, что оба метода выполняют поверхностное копирование, поэтому необходимо вручную учитывать ссылки на вложенные объекты.
Альтернативный подход заключается в созданиивспомогательная функция для создания нового объекта.
function generateCriteria(fieldName, fieldValue) {
return () => ({
fieldName: fieldName,
fieldValue: fieldValue,
childItems: []
});
}
const criteriaLevel1 = generateCriteria('Criteria name', 'Crit-Level-1');
const criteriaLevel2 = generateCriteria('Criteria name', 'Crit-Level-2');
const itemsABC = [
'item AAA',
'item BBB',
'item CCC'
];
const criteriaArray = [];
let ix = 0;
itemsABC.forEach(item => {
console.log('item: ' + item);
criteriaArray[ix] = [];
criteriaArray[ix][0] = criteriaLevel1();
criteriaArray[ix][0].childItems[0] = criteriaLevel2();
criteriaArray[ix][0].childItems[0].childItems[0] = {
fieldName: 'name',
fieldValue: item + '-' + ix
};
ix++;
});
for (let i = 0; i < 3; i++) {
console.log('ix: ' + i);
for (const itemA of criteriaArray[i]) {
console.log('a: ' + itemA.fieldName + ' - ' + itemA.fieldValue);
for (const itemB of itemA.childItems) {
console.log('b: ' + itemB.fieldName + ' - ' + itemB.fieldValue);
for (const itemC of itemB.childItems) {
console.log('c: ' + itemC.fieldName + ' - ' + itemC.fieldValue);
}
}
}
}