[英]Array won't split (using splice(0))
我正在嘗試類似perlin噪聲貼圖的方法,但是我的陣列不會重復! 結果,數組值超過了預期值(> 2)。
數組“ map ”僅包含1和0。
制作一個map副本(稱為cache ),並將數組“ cache ”中的值添加到數組“ map ”中。
一些緩存值被添加以多次映射 。
問題是對“ map ”所做的任何更改似乎都在“ cache ”上重復了,非常令人沮喪。 我對javascript不夠熟悉,無法知道我做錯了什么。
相對代碼:
var map = terrainSeed(); //returns an array of 1's & 0's (random)
map = terrainGen(map, map, 2, 2);
function terrainGen(mapNew, mapOld, x, y)
{
var cache = mapOld.slice(0);
var asdf = 0;
//if(x >=2) if(y >=2)
for(var i = 0; i < cache.length; i++)
{
for(var j = 0; j < cache[i].length; j++)
{
var save = mapNew[i][j];
asdf = cache[(Math.floor(i/x))][(Math.floor(j/y))];
mapNew[i][j] += asdf;
if(mapNew[i][j]>2) alert(save + " + " + asdf + " = " + mapNew[i][j] + " (" + i + ", " + j + ")");
}
}
return mapNew;
}
由於slice
正在執行淺表復制,因此您需要的是深表復制。 因此,要么使用諸如JQuery,Lo-Dash之類的第三方庫,要么自行實現它。
使用JQuery
var cache = $.extend(true, [], mapOld);
使用Lo-Dash
var cache = _.cloneDeep(mapOld);
作為使用純JavaScript的elaijuh答案的替代方法,您需要遍歷mapOld數組值以創建一個新數組...這是這樣的:
var cache = new Array;
for (var i=0;i<mapOld.length;i++) {
cache[i] = mapOld[i];
}
您只需從mapOld
提取值並將其放入cache
……這可能是庫如何實現它,在函數中接受...這是您將如何創建函數:
clone = function(input){
if (input instanceof Array) {
var output = new Array;
for (var i=0;i<input.length;i++) {
output[i] = input[i];
}
return output;
}
}
// Then using...
cache = clone(mapOld);
這是一個JSFiddle示例
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.