从一个数组创建一对循环数组

3
我将尝试创建一个函数,该函数接受一个数组并创建一对数组。例如,对于一个数组[1,2,3,4],这一对数组将是:
pair = [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]] ;

并且配对应该是这样的:
pairs = [[[1,2],[1,3]], [[1,2],[1,4]], [[1,2],[2,3]] .... [[2,4],[3,4] ] ;

到目前为止,我的函数看起来像这样:
function makePairs(arr) {

    var l = arr.length -1 ,  
    pair =  [];
        for(var i=0; i < l ; i++ ) {
          for(var j=i+1; j <= l ; j++ ) {
            pair.push( [arr[i],arr[j]]) ;
          }
        }  

  // i get the desired pair by the above nested for loop... 
  // console.log(pair) ; 

  // i try to do the same nested for loop with the pair array.. 
  // but i get [circular object Array]; 
  var k =  pair.length -1,
  pairs = [] ;
          for(var m=0; m < k ; m++ ) {
          for(var n=m+1; n <= k ; n++ ) {
            pairs.push( [pair[m],pair[n]]) ;
          }
        }
    return pairs; 
}

console.log(  makePairs([1,2,3,4]) );

所以,pair给了我所需的一对值,但是当我用相同类型的嵌套for循环处理pair数组时,我得到了[circular object Array]。我认为嵌套的for循环也会在pairs上工作,但它并不起作用。我读到说,在javascript对象和本地对象之间形成循环引用会导致内存泄漏,但我不知道这里是否发生了这种情况。请帮忙看看。error..

你的代码在FF中运行没有错误。 - James Montagne
它在Chrome中也可以正常运行。在IE中也可以运行良好,除了IE在记录日志时会将数组压平的事实。 - Scott Mermelstein
@PsychHalf 请将您的输出发布为问题的编辑,而不是让我们查看链接上附加的广告。您在哪里运行代码,以便出现循环对象引用? - Scott Mermelstein
@ScottMermelstein 对不起.. 是我的错.. - Psych Half
3个回答

1
我想知道问题是否出在调试器本身。每次引用已经被引用的项时,它都会输出[circular object Array]。
尝试多输出一些控制台消息。将最后一行替换为:
var answer = makePairs([1,2,3,4]);
for (var i = 0; i < answer.length; ++i) {
    console.log("[[" + answer[i][0][0] + ", " + answer[i][0][1] + "], [" + 
         answer[i][1][0] + ", " + answer[i][1][1] + "]]");
}

我敢打赌它会正常打印出来。

@PsychHalf 不要觉得自己很蠢 - 你的代码没问题,每个人都会相信他们的调试器。你用的是哪个调试器? - Scott Mermelstein
谢谢...嗯...好吧...无论它是什么,我都不会再使用它了...我会立刻把它扔出窗外... - Psych Half
@PsychHalf 不想太过于催促,但是是针对特定网络浏览器的开发工具,例如IE或Chrome的F12工具吗?还是像FireBug Lite这样的插件,或者其他什么东西?如果知道“在使用这个特定工具时看到此错误不要感到惊讶”会很有好处。 - Scott Mermelstein
1
尝试使用任何基于Web的控制台,例如jsconsole或其他控制台,它们都会给你一个循环。 - Psych Half

0
尝试使用以下方式进行JSON.stringify()和JSON.parse():

console.log(
  makePairs(
    JSON.parse(
      JSON.stringify([1,2,3,4])
    )
  )
);

0

也许你可以利用一下

console.dir(  makePairs([1,2,3,4])  )

在 Chrome 开发者工具控制台和最新版的 Firefox Firebug 中


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接