数组不会分裂(使用splice(0))

时间:2014-12-24 03:11:57

标签: javascript arrays slice perlin-noise

我正在尝试像perlin噪音地图这样的东西,但我的阵列不会重复!结果,数组值超过预期值(> 2)。

数组" 地图"仅由1和0组成。

制作地图的副本(称为缓存)和数组中的值" 缓存"被添加到数组" 地图"。

缓存的某些值会多次添加到地图

问题是对" 地图"所做的任何更改出现要复制在" 缓存",非常令人沮丧。我对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;
    }

2 个答案:

答案 0 :(得分:1)

slice正在进行浅层复制时,您需要的是深层复制。所以要么使用像JQuery,Lo-Dash这样的第三方库,要么自己实现它。

使用JQuery

var cache = $.extend(true, [], mapOld);

使用Lo-Dash

var cache = _.cloneDeep(mapOld);

答案 1 :(得分:0)

作为elaijuh答案的替代方法,使用纯JavaScript,您需要循环遍历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

的示例