js重写循环中的前一个元素

时间:2017-11-22 18:29:22

标签: javascript react-native

我想在循环中将元素推送到数组,但是当我的方法返回一个值时,它总是重写数组的每个元素(可能返回的值指的是同一个对象)。我有一天遇到这个问题,我无法理解问题出在哪里,因为我总是试图创建新对象并将它们分配给'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;
}

1 个答案:

答案 0 :(得分:1)

  

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

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

这是阵列变异的例子。

vectorDrawables.useSupportLibrary = true

为避免改变源数组,您可以创建它的副本

let array1 = [1,2,3];
let array2 = array1;
array2[0] = 4; // oops, now the content of array1 is [4,2,3]
  

我一直试图创建新对象并将其分配给&#39; var&#39;不   让&#39;让&#39;变量

使用let / var不会阻止重写。使用let array1 = [1,2,3]; let array2 = array1.slice(); array2[0] = 4; // the content of array1 is still the same [1,2,3] 创建新对象不会阻止重写。

很难从错误的代码和描述中读取错误,但您可以尝试避免通过引用传递数组,而是创建副本并在函数调用中传递副本。

new Array()

这是一个浅层复制示例,您可能需要应用深层复制才能使其适用于您的案例。