我试图在“免费代码阵营”网站上解决一些编程挑战,问题是要找到多个数组之间的对称差异,并返回所提供数组的对称差异数组。
例如以下数组:
[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
一旦它到达数组中存在的元素,它就会删除从该元素开始直到数组末尾的所有元素。
我不确切地知道我是否遗漏了什么,我试图寻找任何类似的问题,但我提出的大部分内容都是从数组中删除元素的问题,因为这个人正在循环并因此丢失它的索引..在我的情况下,我试图修改的数组与我正在迭代的数组无关。 此外,我相信拼接修改数组并返回已删除的元素..如果我没有得到它,请纠正我。
答案 0 :(得分:0)
您错放了)
,这是更正:
final.splice( final.indexOf(current_array[j]), 1 );
另外需要注意:算法为第一个数组添加5
,第二个数组删除它,然后为第三个数组添加它(因为它不再出现在final
中) ,结果为[1,4,5]
。
使用奇数个参数,保留该值,使用偶数,将其删除。
从所有数组中获取所有唯一值的简单方法(如果这是意图)是计算出现次数并过滤单次出现:
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;
请注意,这将返回[1,4]
而不是[1,4,5]
。