【问题标题】:Why does array contain only last value n times?为什么数组只包含最后一个值 n 次?
【发布时间】:2018-02-18 01:40:39
【问题描述】:
这个函数在数组列表中返回相同的值。
例如,如果i=10,那么我的数组应该包含 10 个不同的值,但它只存储最后一个值 10 次。
我的代码有什么问题?
$scope.webTempIds=[];
$scope.wId={};
$scope.getIds=function(){
for(var i=0;i<$rootScope.retData.length;i++){
$scope.wId.ID=$rootScope.retData[i].WEBUI_TEMP_ID;
$scope.webTempIds.push($scope.wId);
}
return $scope.webTempIds;
}
【问题讨论】:
标签:
javascript
angularjs
arrays
scope
【解决方案1】:
正如其他人正确指出的那样,您最终得到数组中的最后一项,因为您推送到数组的值位于 $scope 上,并且每次都被新值替换。
要提供另一种方法,您可以使用 Array.prototype.map 函数返回一个新数组,其中预填充了每个数据项的 id 属性值:
$scope.getIds=function(){
$scope.webTempIds = $rootScope.retData.map(
function(obj){
return obj.id;
}
);
}
这消除了任何带有临时变量的循环和任何pushing 从头开始手动构建新数组的需要。
【解决方案2】:
发生这种情况是因为您在循环外使用 $scope 代替 wId.ID。因此,您的列表项指向同一个对象。
更改 $scope.wId.ID 后,$scope.webTempIds 列表也会更新。
要修复它,请将 id 设为本地:
for(var i=0;i<$rootScope.retData.length;i++){
var wId = {
ID: $rootScope.retData[i].WEBUI_TEMP_ID;
}
$scope.webTempIds.push(wId);
}
附带说明:使用 Scope 绑定应用程序控制器和视图。 (在 for 循环内你不需要作用域)
【解决方案3】:
$scope.getIds=function(){
$scope.webTempIds=[];
for(var i=0;i<$rootScope.retData.length;i++){
$scope.wId={};
$scope.wId.ID =$rootScope.retData[i].WEBUI_TEMP_ID;
$scope.webTempIds.push($scope.wId);
}
return $scope.webTempIds;
}
【解决方案4】:
$scope.wId={};
每次都会改变。该数组包含对该对象的引用,因此当您更改值时,它会更改数组中的值。
let obj = {};
let result = [];
for(let i = 0; i<10; i++){
obj.a = i;
result.push(obj);
}
console.log(result);