【问题标题】:Array won't split (using splice(0))数组不会拆分(使用 splice(0))
【发布时间】:2014-12-24 03:11:56
【问题描述】:

我正在尝试类似 perlin 噪声图,但我的数组不会重复!结果数组值超过了预期值(>2)。

数组“ma​​p”只包含 1 和 0。

ma​​p 的副本被制作(称为 cache)并将数组“cache”中的值添加到数组“地图”。

cache 的某些值被多次添加到 ma​​p

问题是对“ma​​p”所做的任何更改似乎会在“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(0) 是多余的 var cache = mapOld.slice(0);相当于说 var cache = mapOld;
  • slice() 方法返回数组一部分的浅拷贝
  • 当你定义一个变量时,你不是在“缓存”,你只是在创建一个引用。变量不等于新值。一个变量追溯原始数据。
  • @elijuh 那么为什么要更改缓存效果 mapNew?
  • @Xero 它不应该是一个参考,它应该是一个“独立”的重复数组。如果 slice 不是正确的函数是什么?

标签: javascript arrays slice perlin-noise


【解决方案1】:

slice 在做浅拷贝,你需要的是深拷贝。所以要么使用一些第三方库,比如 JQuery、Lo-Dash,要么自己实现。

使用 JQuery

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

使用 Lo-Dash

var cache = _.cloneDeep(mapOld);

【讨论】:

  • 谢谢!出于好奇,你什么时候会真正使用浅拷贝,而不仅仅是对数组本身进行操作?
  • 复制只有原始类型元素的数组时
【解决方案2】:

作为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

【讨论】:

  • 仅适用于具有原始类型元素的数组。操作员= 也在为对象分配引用。所以这可能不适用于@ApolloCreed 的要求。
  • @elaijuh 他说他的数组包含 1 和 0。
  • @elaijuh 很有趣,“var cache = new Array; var cache = mapOld;”尽管是数组数组,但似乎可以工作。 ¯_(ツ)_/¯(我对原始变量与复杂变量的知识 100% 来自这篇文章:en.wikibooks.org/wiki/JavaScript/…
  • @Xero 你是对的,一旦我开始实现递归函数,很明显它不能正常工作:-/ elaijuh 的答案是最好的!
  • @Xero 他正在我猜想的二维数组上操作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多