javascript - 在javascript中递归复制二维数组的算法

标签 javascript arrays copy

我想找到这种将二维数组复制到不同堆对象的算法。例如,如果我有...

 var result = [[8,2,5],[3],[8,5,2],[0]];
    var resultCopy = copyArray(result);
    resultCopy[2][0] = 9;

...那么......alert(result[2][0]);......应该是8而不是9!

我所拥有的是这个,但它不起作用,我似乎可以在其他地方找到答案:

  function copyArray(array){
    result;
    array.length==0?return result;
    for(var i=0;i!=array.length;i++){
        if(array[i] instanceof Array){
            return result.push(copyArray(array[i].slice(0)));
        } else {
            return result.push(array)
            }
        }
    }

最佳答案

如果您足够幸运拥有 NetScape 浏览器衍生产品(FF 等)

resultCopy = eval  (  uneval( result  )   );

resultCopy = eval  (  result  .   toSource(  )   );

否则使用(这有严格的限制,但满足并满足OP条件):

resultCopy = eval( "[ [" + result  .  join("], \n[")   + "] ]" );

eval函数是“内置”的,隐藏了其算法的递归性质。

如果递归(即递归)是神圣不可侵犯的,那么下面的内容就是非常虔诚的,没有迭代语句,并且完全递归直到每个元素都不是数组。 (即,当元素是数组或位于数组中时,就会发生递归)。给定一个数组,如果它是空的,那么它的副本也将是空的 array.length < 1 ? [ ] 。如果不是,则从数组中取出一个元素,将数组缩小为需要进一步处理的较小数组。这是递归归约步骤RAffle ( array . pop( ), arbitArrayCopy ( array ) ) 。新数组填充 element已删除nuRA . push ( ... ) 。如果element恰好是一个数组,然后进一步处理它,即。递归element instanceof Array ? arbitArrayCopy ( element ) 。这个算法是破坏性的,原始数组是完好无损的,所以恢复它:array . push ( element ) .

 function arbitArrayCopy ( array )  { 
  /* copies any nD array structure and primitive array elements  but 
                  complex compound object array elements are referenced and not copied   */
       return array.length < 1   ?   [ ]   : RAffle ( array . pop( ),  arbitArrayCopy ( array )  )  ;
       function RAffle ( element, nuRA )  {
               nuRA  .  push ( element instanceof Array ?  arbitArrayCopy  ( element  )   :  element  ) ;
               array   .  push ( element )  ;
               return  nuRA
       }
  }

测试:

data:text/html;charset=utf-8,<html>
<!-- this is a scriple or scURIple which codes generic URI's of arbitrary schema
               -  javascript: schema specific scriples/scURIples are known as scriplets or bookmarklets -->
<script>
javascript:

function RAcopy ( array ) {  return array.length < 1   ?   [ ]   :  RAffle( array . pop( ),  RAcopy ( array ) ) ;
    function RAffle ( element, nuRA )  {
        nuRA  .  push ( element instanceof Array ?  RAcopy  ( element  )   :  element  ) ;
        array   .  push ( element )  ;                                                   return  nuRA
}   }

result = [[8,2,5],[3],[8,5,2],[0]];
RAdup = RAcopy ( resultCopy = eval( "[ [" + result  .  join("], \n[")   + "] ]" )  )  ;
resultCopy[2][0] = 9;    resultCopy[3] = [10,11,12];   RAdup[1]=[ 42, 33, 24 ];    delete RAdup[3];

alert  (  [    "Test environment:\n " + window.navigator.userAgent, 
                    "RAdup =\n"       + RAdup         . join("], \n[") , 
                    "resultCopy =\n" + resultCopy   . join("], \n[") , 
                    "result =\n"         + result            . join("], \n[")                      ]  .  join("\n ..................... \n")   );

</script></html>

(警告:由于并发 URI、javascript 和 HTML 语法的 split 语言变幻莫测,scURIple 受到多语言挑战,但方便立即模式地址栏拖放执行 - 它们的共生协同作用经常屈服于寄生 - 幸运的是,这里的力量是一致的 - 特别是 HTML <script> 故意包含一个 javascript: 标签,通过 javascript: schema/protocol 使脚本成为有效的 URI scriplet,并且所有这些都嵌入到更大的URI data: schema scURIple - 所以 data: URI scURIple 编码有效的 HTML,它编码有效的 javascript,它编码有效的 javascript: URI scriplet - 当脚本生成其他 scURIples 甚至它自己时,事情变得真的 sqURIlly)

测试结果:

Test environment: 
 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4
                                                                                                                            (Splashtop-v1.2.17.0)
 ..................... 
RAdup =
8,2,5], 
[42,33,24], 
[8,5,2], 
[
 ..................... 
resultCopy =
8,2,5], 
[3], 
[9,5,2], 
[10,11,12
 ..................... 
result =
8,2,5], 
[3], 
[8,5,2], 
[0

链接: Algorithm for copying 2 dimensional array in javascript recursively

关于javascript - 在javascript中递归复制二维数组的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20153943/

相关文章:

php - 从 php 文件中读取 1000 字节的 block

xcode - 如何制作 Mac 安装程序将简单地从中安装(复制)文件的 .pkg?

node.js - 使用 fs 流创建一个重复文件并能够读取它

javascript - CSS 过渡持续时间不适用于过渡效果的第一个实例

python - 比较数组值的更简洁的方法?

javascript - 验证 angularjs 中的密码指令

java - 计算空闲 block 直到有已用 block 的算法

javascript - execCommand ('copy' ) 在 Ajax/XHR 回调中不起作用?

javascript - Gmail API发送电子邮件错误401 :Invalid Credentials

javascript - 如何在 java 应用程序仍在编译时显示加载页面?