我想在循环中将元素推送到数组中,但是当我的方法返回一个值时,它总是重写数组的每个元素(可能返回的值是同一个对象)。有一天我被这个问题困住了,我不明白问题出在哪里,因为我总是尝试创建新的对象,并将它们赋值给'var‘而不是'let’变量。这是我的代码:
setSeason(competitions, unions) {
var categories = this.sortCategories(competitions);
var unionsByCategories = new Array();
let k = 0;
for (; k < categories.length; k++) {
unionsByCategories[k] = this.assignCompetitionsToUnions(unions[0], categories[k]);
}
this.setState({categories: unionsByCategories, refreshing: false})
}和
assignCompetitionsToUnions(unions1, competitions) {
var unions2 = this.alignUnions(unions1);
let tempUnions = [];
for (var i = 0; i < unions2.length; i++) {
var tempUnionsCompetitions = new Array();
var tempSubsCompetitions = new Array();
if (Globals.checkNested(unions2[i], 'union')) {
tempUnionsCompetitions = unions2[i].union;
tempUnionsCompetitions['competitions'] = this.getCompetitionsById(unions2[i].union.id, competitions);
}
if (Globals.checkNested(unions2[i], 'subs')) {
for (var j = 0; j < unions2[i].subs.length; j++) {
if (Globals.checkNested(unions2[i].subs[j], 'union')) {
tempSubsCompetitions[tempSubsCompetitions.length] = {union: unions2[i].subs[j].union};
tempSubsCompetitions[tempSubsCompetitions.length - 1]['union']['competitions'] =
this.getCompetitionsById(unions2[i].subs[j].union.id, competitions)
}
}
}
tempUnions.push({union: tempUnionsCompetitions, subs: tempSubsCompetitions});
}
return tempUnions;
}非常感谢你的帮助。
Answer updated by @Knipe请求
alignUnions(unions3) {
let newUnions = unions3.subs;
newUnions = [{union: unions3.union}].concat(newUnions);
return newUnions.slice(0, newUnions.length - 1);
}
getCompetitionsById(id, competitions) {
let tempCompetitions = [];
for (let i = 0; i < competitions.length; i++) {
if (competitions[i].union.id === id) {
tempCompetitions.push(competitions[i]);
}
}
return tempCompetitions;
}
sortCategories(competitions) {
if (competitions.length === 0) return [];
let categories = [];
categories.push(competitions.filter((item) => {
return item.category === 'ADULTS' && item.sex === 'M'
}));
categories.push(competitions.filter((item) => {
return item.category === 'ADULTS' && item.sex === 'F'
}));
categories.push(competitions.filter((item) => {
return item.category !== 'ADULTS'
}));
return categories;
}发布于 2017-11-22 19:35:57
它总是重写数组的每个元素(可能返回的值引用同一个对象)。
您可能无意地改变了源数组的内容。我建议创建数组的副本。
这是数组突变的例子。
let array1 = [1,2,3];
let array2 = array1;
array2[0] = 4; // oops, now the content of array1 is [4,2,3]若要避免更改源数组,可以创建源数组的副本。
let array1 = [1,2,3];
let array2 = array1.slice();
array2[0] = 4; // the content of array1 is still the same [1,2,3]我一直试图创建新的对象,并将它们分配给'var‘而不是'let’变量。
使用let/var不会阻止重写。使用new Array()创建新对象不会阻止重写。
很难从您的代码和描述中读取bug的确切位置,但是您可以尝试避免通过引用传递数组,而是创建一个副本并在函数调用中传递该副本。
this.assignCompetitionsToUnions(unions[0].slice(), categories[k])
这是一个简单的副本示例,您可能需要应用深度复制来使其适用于您的情况。
https://stackoverflow.com/questions/47441639
复制相似问题