Javascript的“拼接”方法奇怪的行为

时间:2015-08-01 13:58:32

标签: javascript arrays splice

我试图在“免费代码阵营”网站上解决一些编程挑战,问题是要找到多个数组之间的对称差异,并返回所提供数组的对称差异数组。

例如以下数组:

[1,2,5],[2,3,5],[3,4,5]

应该返回 [1,4,5]

这就是我想出的:

function sym() {
  var final = [];
  var current_array = [];

  for (var i = 0; i < arguments.length; i++) {
    current_array = arguments[i];
    //ensures duplicates inside each array are removed first
    current_array = current_array.filter(function (element, index) {
      return current_array.indexOf(element) == index;
    });

    for (var j = 0, end = current_array.length; j < end; j++) {
      if(final.indexOf(current_array[j]) < 0)
        final.push(current_array[j]);
      else
        // for some reason "splice" isn't working properly..
        // final.splice(final.indexOf(current_array[j], 1));
        delete final[final.indexOf(current_array[j])];
    }
  }

  var final_2 = [];
  // Removing the empty slots caused by the "delete" keyword usage
  for (var m = 0; m < final.length; m++) {
    if(typeof final[m] !== 'undefined')
      final_2.push(final[m]);
  }
  return final_2;
}

在之前的逻辑中我创建了一个名为 final 的数组,该数组应该包含所有传递的数组中只存在一次的所有元素,首先我遍历 arguments < / strong>这里表示数组的参数,对于每个数组,我遍历其元素并检查该元素是否存在于 final 数组中。如果它存在,我将其从最终数组中删除,否则我将其推送到数组。

这里的问题是如果我使用上面代码中给出的splice方法,它表现得非常奇怪,例如对于以下数组

[1,2,3],[5,2,1,4] ,结果应为: [3,5,4]

当我使用这一行时

final.splice(final.indexOf(current_array[j], 1));
而不是

delete final[final.indexOf(current_array[j])];

并返回最终数组,返回 [4]

这是每次迭代的数组值

round(0,0):1
round(0,1):1,2
round(0,2):1,2,3
圆(1,0):1,2,3,5
round(1,1):1
round(1,2):
圆(1,3):4

一旦它到达数组中存在的元素,它就会删除从该元素开始直到数组末尾的所有元素。

我不确切地知道我是否遗漏了什么,我试图寻找任何类似的问题,但我提出的大部分内容都是从数组中删除元素的问题,因为这个人正在循环并因此丢失它的索引..在我的情况下,我试图修改的数组与我正在迭代的数组无关。 此外,我相信拼接修改数组并返回已删除的元素..如果我没有得到它,请纠正我。

1 个答案:

答案 0 :(得分:0)

您错放了),这是更正:

final.splice( final.indexOf(current_array[j]), 1 );

另外需要注意:算法为第一个数组添加5,第二个数组删除它,然后为第三个数组添加它(因为它不再出现在final中) ,结果为[1,4,5]。 使用奇数个参数,保留该值,使用偶数,将其删除。

从所有数组中获取所有唯一值的简单方法(如果这是意图)是计算出现次数并过滤单次出现:

&#13;
&#13;
function sym2() {
  var count = {};
  for ( var i in arguments ) {
    console.log("Processing ", i );
    for ( var k = 0; k < arguments[i].length; k ++)
      count[ arguments[i][k] ] = (count[ arguments[i][k] ]||0) + 1;    
  }
  var final = [];
  for ( var i in count )
    if ( count[i] == 1 )
      final.push( i );
  return final;
}
sym2([1, 2, 5], [2, 3, 5], [3, 4, 5]);
&#13;
&#13;
&#13;

请注意,这将返回[1,4]而不是[1,4,5]