Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript array.push仅为for循环中的最后一个变量_Javascript_Frontend - Fatal编程技术网

Javascript array.push仅为for循环中的最后一个变量

Javascript array.push仅为for循环中的最后一个变量,javascript,frontend,Javascript,Frontend,我实际上在问自己,为什么下面的代码不能正常工作?我找到了解决方案,但有点棘手,我不喜欢这个解决方案 下面是代码和问题: function powerSet( list ){ var set = [], listSize = list.length, combinationsCount = (1 << listSize), combination; for (var i =

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

下面是代码和问题:

    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; 
    }
功能电源集(列表){
变量集=[],
listSize=list.length,

CombinationScont=(1在第一个版本中,您构建了一个
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()
的对象文本将在每次代码运行时创建一个新的、不同的对象。

@Rajesh这绝不是它的副本;它与闭包无关。
JSON.parse(JSON.stringify(map))没有任何意义
事情,我不这么认为。如果你不确定它是否是字符串,那就确保它肯定是一个对象。除非你使用jquery,否则就没有理由期望它会是除字符串以外的任何东西。那么构建新对象的最佳方法是什么?@Françoiscuy你的第二段代码做得正确。我将加上答案。好吧,但我的意思是这样有点脏,不是吗?不,这没什么错。这是一个非常常见的成语。
           mapBis[i].comps_match.push({certif: false,
               experience: 0,
               expert: false,
               grade: 1,
               last: 100,
               name: tmpList[elem].join(", ")});