数组中.在for循环javascript中只推入最后一个变量

array.push only the last variable in a for loop javascript

本文关键字:变量 最后一个 javascript for 循环 数组      更新时间:2023-09-26

我实际上在问自己为什么下面的代码不能正常工作,我找到了解决方案,但它有点棘手,我不喜欢这个解决方案

下面是代码和问题:

    function powerSet( list ){
        var set = [],
            listSize = list.length,
            combinationsCount = (1 << listSize),
            combination;
        for (var i = 1; i < combinationsCount ; i++ ){
            var combination = [];
            for (var j=0;j<listSize;j++){
                if ((i & (1 << j))){
                    combination.push(list[j]);
                }
            }
            set.push(combination);
        }
        return set;
    }
    function getDataChartSpe(map) {
        var res = {};
        for (var i in map) {
            console.log("'n'n");
            var dataSpe = {certif: false,
                experience: 0,
                expert: false,
                grade: 1,
                last: 100,
                name: undefined 
            };
            var compMatchList = [];
            for (var j in map[i].comps_match) {
                var tmp = map[i].comps_match[j];
                compMatchList.push(tmp.name)
            }
            var tmpList = powerSet(compMatchList);
            var lol = [];
            lol.push(map[i].comps_match);
            for (elem in tmpList) {
                console.log("mdr elem === " + elem + " tmplist === " + tmpList);
                var tmp = tmpList[elem];
                dataSpe.name = tmpList[elem].join(" ");
                lol[0].push(dataSpe);
            }
            console.log(lol);
        }
        return res; 
    }

现在这里仍然是相同的代码,但运行良好:

    function powerSet( list ){
        var set = [],
            listSize = list.length,
            combinationsCount = (1 << listSize),
            combination;
        for (var i = 1; i < combinationsCount ; i++ ){
            var combination = [];
            for (var j=0;j<listSize;j++){
                if ((i & (1 << j))){
                    combination.push(list[j]);
                }
            }
            set.push(combination);
        }
        return set;
    }

    function getDataChartSpe(map) {
        var res = {};
        var mapBis = JSON.parse(JSON.stringify(map));
        for (var i in map) {
            var compMatchList = [];
            for (var j in map[i].comps_match) {
               var tmp = map[i].comps_match[j];
               compMatchList.push(tmp.name)
           }
           var tmpList = powerSet(compMatchList);
           mapBis[i].comps_match = [];
           for (elem in tmpList) {
               tmpList[elem].sort();
               mapBis[i].comps_match.push({certif: false,
                   experience: 0,
                   expert: false,
                   grade: 1,
                   last: 100,
                   name: tmpList[elem].join(", ")});
           }
       }
       return mapBis;
    }

实际上这对我来说有点失望,因为它完全一样,但是第一个不工作,第二个工作。

所以如果有人能帮我理解我做错了什么,我会很高兴的

ps:对不起,如果我的英语有点坏

在第一个版本中,您构建一个 dataSpe对象并反复使用它。每次运行:

            lol[0].push(dataSpe);

你将同一个对象的引用推入数组。

第二个版本的函数可以工作,因为它每次构建一个新的对象:
           mapBis[i].comps_match.push({certif: false,
               experience: 0,
               expert: false,
               grade: 1,
               last: 100,
               name: tmpList[elem].join(", ")});

传递给.push()的对象字面值将在每次代码运行时创建一个新的、不同的对象。