我的函数需要接受任意数量的列表,然后输出它们的对称差异。 DELETE FROM `table` WHERE id NOT IN = (SELECT FLOOR( MAX(id) * RAND()) FROM `table` );
应该返回sym([1, 2, 3], [5, 2, 1, 4])
和[3, 5, 4]
。我对代码的结果感到困惑 - 这会返回一个空数组。
sym([1, 2, 5], [2, 3, 5], [3, 4, 5]) should return [1, 4, 5]
答案 0 :(得分:2)
已编辑:添加一些代码
您的循环变量都是全局变量,包括i
。在他们面前加var
(至少在i
之前),你已经完成了。
以下是两个集的对称差异。我希望你能从那里开始。
function isin(num,arra)
{
for (var i=0; i<arra.length; i++)
{
if (num == arra[i]){return true;}
}
return false;
}
function sym()
{
var j,k,i,l;
var syms = [];
for ( i=0; i<arguments.length; i++)
{
var ins = false;
for (k=i+1; k < arguments.length; k++){
for ( j=0; j<arguments[i].length; j++){
if(!isin(arguments[i][j], arguments[k]))
{
syms.push(arguments[i][j]);
}
}
for ( l=0; l<arguments[k].length; l++){
if(!isin(arguments[k][l], arguments[i]))
{
syms.push(arguments[k][l]);
}
}
}
}
return syms;
}
sym([1, 2, 3], [5, 2, 1, 4]);
答案 1 :(得分:1)
我的代码返回一个未定义值的数组
这是因为当您推进syms
时,您的j
变量的for循环已经完成。所以它实际上在j = <arguments[i].length
(现在它确实是一个超出范围的索引读取)。
if (ins === false)
{
syms.push(arguments[i][j]); # push "undefined" onto syms.
}
确保将此代码块放在for (var j=0; j<arguments[i].length; j++)
块中。
答案 2 :(得分:1)
为了解决多个数组的对称差异,我们可以从设计一个返回两个数组的对称差异的函数开始
如 function sym2()所示,从sym2(a1,a2)获取结果的主要思路可分为两个步骤:(1)。对于数组a1 []中的每个元素,如果a1 [j]不在数组中a2 [] 且 a1 [j]不在结果数组syms []中,则推送a1 [j]到结果数组。 (!isin(a1 [j],syms)可以防止a1 []中的重复数,例如sym2([1,1],[3])可以返回[1,3]而不是在完成a1-a2之后,第二步a2-a1以相同的方式执行(2)。对于数组a2 []中的每个元素,如果a2 [l]不在数组a1中[ ]和a2 [l]不在结果数组syms []中,然后将a2 [l]推送到结果数组。
函数sym()获取数组列表,首先,我们可以将所有数组从参数保存到变量,如arg [array1,array2,array3],并使用数组.reduce()功能。例如,如果arg包含[a1,a2,a3] arg.reduce(函数(a,b){return sym2(a,b)});执行如下:
syms2(a1,a2)
syms2(syms2(A1,A2),a3)的
所有代码:
function isin(num,arra)
{
for (var i=0; i<arra.length; i++)
if (num == arra[i]){return true;}
return false;
}
function sym2(a1,a2)
{
var j,l;
var syms = [];
for ( j=0; j<a1.length; j++){
if(!isin(a1[j], a2)&&!isin(a1[j],syms))
syms.push(a1[j]);
}
for ( l=0; l<a2.length; l++){
if(!isin(a2[l], a1)&&!isin(a2[l],syms))
syms.push(a2[l]);
}
return syms;
}
function sym(){
var arg=[];
for(var o = 0; o<arguments.length;o++)
arg.push(arguments[o]);
return arg.reduce(function(a,b){
return sym2(a,b);
});
}