我想找到这种将二维数组复制到不同堆对象的算法。例如,如果我有...
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/