我具有以下函数,该函数完全无法解释为什么失败:
function GetPlayersMap ( map, id ){
let compressedMap = [];
for(let x = 0; x < map.length; x++){
for(let y = 0; y < map[x].length; y++){
if(map[x][y].claimant_id != null) {console.log(map[x][y].claimant_id); console.log(id)}
if(id == null || map[x][y].claimant_id != id){
map[x][y].count = null;
}
if(map[x][y].claimant_id != null){
console.log(map[x][y]);
compressedMap.push(map[x][y]);
}
}
}
return compressedMap;
}
map
是对象的二维数组,map.count
是在输入函数时永远不会null
的整数。 id
是一个整数,可以是null
。预期的结果是,在id
的{{1}}输入上,它返回一个0
,其中一个对象与此匹配。该函数被调用两次,先使用相同的compressedMap
,然后依次使用map
和id
的{{1}}。控制台中打印的是
0
无论我是否将第5行更改为
,都将打印此文件null
(没有意义,这意味着它将0匹配为null)或
0
0
Tile { x: 0, y: 0, claimant_id: 0, count: null, fake_claimed: false }
0
null
Tile { x: 0, y: 0, claimant_id: 0, count: null, fake_claimed: false }
仅当我将其更改为
if(id == null){
我得到预期的输出
if(map[x][y].claimant_id != id){
我添加了代码的简化示例
if(false){
答案 0 :(得分:1)
map.count是一个整数,在输入函数时永远不会为空。
我不同意该声明,因为您不复制数组或嵌套在其中的对象,因此map[x][y].count = null;
将编辑数组/对象永久对象。这可能会导致null==0
的麻烦,尽管该调用从未执行过代码。
在代码下面附有深拷贝。这能回答您的问题吗?
由于您已分配了数据,因此我认为请阅读有关deep-copy的文章。
class Tile {
constructor(x, y) {
this.x = x;
this.y = y;
this.claimant_id = null;
this.count = 1;
this.fake_claimed = false;
}
}
var map = []
for (let x = 0; x < 10; x++) {
map.push([]);
for (let y = 0; y < 10; y++) {
map[x].push(new Tile(x, y));
}
}
map[0][0].claimant_id = 0;
function GetPlayersMap(map, id) {
// added copy of array
const copy = JSON.parse(JSON.stringify(map));
let compressedMap = [];
for (let x = 0; x < copy.length; x++) {
for (let y = 0; y < copy[x].length; y++) {
if (id == null || copy[x][y].claimant_id != id) {
copy[x][y].count = null;
}
if (copy[x][y].claimant_id != null) {
console.log(copy[x][y]);
compressedMap.push(copy[x][y]);
}
}
}
return compressedMap;
}
GetPlayersMap(map, 0);
GetPlayersMap(map, null);
GetPlayersMap(map, 0);