gpt4 book ai didi

javascript - Angular/Typescript 二维数组问题

转载 作者:行者123 更新时间:2023-12-02 22:54:00 27 4
gpt4 key购买 nike

我正在绞尽脑汁地想通过重新使用之前设置的对象(Angular/Typescript)来分配 2 个暗淡的对象数组。我的结果显示最后一个分配覆盖了前两个分配,我不明白为什么。你能看看我缺少什么吗?

    export interface Criteria {
fieldValue: any;
fieldName: string;
childItems?: Criteria[];
}


// function to build my array of objects:
setCriteria() {
// parent object 1
// to be reused / reassigned to array below
const criteriaLevel1: Criteria = {
fieldName: 'Criteria name',
fieldValue: 'Crit-Level-1',
childItems: []
};
// parent object 2 - child of object 1
// to be reused / reassigned to array below
// into - childItems[0]
const criteriaLevel2: Criteria = {
fieldName: 'Criteria name',
fieldValue: 'Crit-Level-2',
childItems: []
};
// list of 3 different items to be assigned to array
// into - childItems[0].childItems[0] of each array record.
const itemsABC: string[] = [
'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++;
});

// output test

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);
}
}
}

}
}

我得到这个输出:

索引:0 - 插入项目:项目 AAA

索引:1 - 插入项目:项目 BBB

索引:2 - 插入项目:项目 CCC

ix:0

a:标准名称 - Crit-Level-1

b:条件名称 - Crit-Level-2

c: name - item CCC-2//但我期待这里:item AAA-0

九:1

a:标准名称 - Crit-Level-1

b:条件名称 - Crit-Level-2

c: name - item CCC-2//但我在这里期待:item BBB-1

九:2

a:标准名称 - Crit-Level-1

b:条件名称 - Crit-Level-2

c:名称 - 项目 CCC-2//YES,如预期:项目 CCC-2

我做错了什么?

最佳答案

您正在分配对对象的引用,因此 criteriaArray 的所有三个元素都指向 criteriaLevel1相同实例和criteriaLevel2

<小时/>

您有几个选项可以保持相同的模式:

Spread syntax (但请注意 the compatibility matrix )

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);
}
}
}
}

Object.assign()

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);
}
}
}
}

关于javascript - Angular/Typescript 二维数组问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58071897/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com