繁体   English   中英

array.push 仅在 for 循环 javascript 中的最后一个变量

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

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

这是代码和问题:

    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对象并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()对象文字将创建一个新的、不同的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM