首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >js在循环中重写以前的元素

js在循环中重写以前的元素
EN

Stack Overflow用户
提问于 2017-11-22 18:29:21
回答 1查看 65关注 0票数 0

我想在循环中将元素推送到数组中,但是当我的方法返回一个值时,它总是重写数组的每个元素(可能返回的值是同一个对象)。有一天我被这个问题困住了,我不明白问题出在哪里,因为我总是尝试创建新的对象,并将它们赋值给'var‘而不是'let’变量。这是我的代码:

代码语言:javascript
复制
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})
}

代码语言:javascript
复制
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请求

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-22 19:35:57

它总是重写数组的每个元素(可能返回的值引用同一个对象)。

您可能无意地改变了源数组的内容。我建议创建数组的副本。

这是数组突变的例子。

代码语言:javascript
复制
let array1 = [1,2,3];
let array2 = array1;
array2[0] = 4; // oops, now the content of array1 is [4,2,3]

若要避免更改源数组,可以创建源数组的副本。

代码语言:javascript
复制
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])

这是一个简单的副本示例,您可能需要应用深度复制来使其适用于您的情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47441639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档