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(", ")});