2017-06-16 106 views
1

关键是我不是JS的专家,所以如果我的代码是一个很大的错误,实际上我只是通过围绕网络进行的研究来学习制作一个巨大的“科学怪人”的培训。创建一个变量与两个.map()寻找匹配或相交两个阵列。寻找匹配或交叉

我想采取两组或用户输入的值列表,并比较他们寻找与js和jquery匹配。

首先,我将两组输入(不同类别)的值与.map()一起取值,以得到创建数组的值。

var x = $(".row_a").map(function() { 
    return this.value; 
}).get(); 

var y = $(".row_b").map(function() { 
    return this.value; 
}).get(); 

然后我装盘创建包含两个arryas separatly(如果觉得我有这个问题可能),如果我“hardcode”阵列中的脚本的下一部分按预期工作一个变量,但如果我使用上面提到的前两个变量,脚本就会崩溃。

var arrays = [ 
    [x], 
    [y] 
    ]; 

第三部分(我真不明白深的这部分代码),我跑这两个arrys比较第二变量,然后用追加的结果的一段脚本。

var result = arrays.shift().reduce(function(res, v) { 
if (res.indexOf(v) === -1 && arrays.every(function(a) { 
    return a.indexOf(v) !== -1; 
    })) res.push(v); 
return res; 
}, []); 

$(".match").append("<div>Numbers " + result + " match in both lists</div>"); 

有人可以帮我undersnatd什么是错或giveme线索或链接,可以帮助?

好奇:如果我在包含数组变量使用same variable twice,该脚本工作,发现四场比赛(我认为是正确的becouse比较同一阵列)

DEMO

-

编辑:

感谢@KarlReid和@Potorr。我不知道javascript中的交叉概念,所以现在我知道了一个更好的方法来实现结果。我会更详细地了解它,试着深入理解答案。

感谢@Alexandru让我知道sintax错误,从今以后它将是非常基础和有用的。

最终结果:DEMO

(我将修改后的丝毫不差,试图改善与他人在未来同样的问题搜索。)

+0

所以你只是想两个数组的交集(即,出现在两人面前的设定值)? –

+0

是的,这是我期待的结果 – Tuux

+1

如果你有谷歌的“javascript数组交集”,我喜欢[this](https://stackoverflow.com/a/43820518/7852370)之一。 –

回答

1

这个作品在,解释-line:

$(".action").click(function() { 
    var x = $(".row_a").map(function() { 
    return this.value; 
    }).get() 

    var y = $(".row_b").map(function() { 
    return this.value; 
    }).get() 

    // this is not really needed, if you want it: 
    // x, y are already arrays, so you don't need to wrap them with [] 
    // var arrays = [ 
    // x, 
    // y 
    //]; 

    // intersection, adapted from: https://stackoverflow.com/questions/1885557/simplest-code-for-array-intersection-in-javascript 
    // if you use the "arrays" variable, then change x to arrays[0] and y to arrays[1] 
    //var intersection = x.filter(function(n) { 
    // return y.indexOf(n) !== -1; 
    //}); 

    // the intersection function posted by @KarlReid is actually better and faster: 
    var intersection = x.filter(Set.prototype.has, new Set(y)); 

    // create the result string 
    var result = intersection.join(',') 

    $(".match").append("<div>Numbers " + result + " match in both lists</div>"); 
}); 

编辑:改变相交函数到所述一个张贴由@KarlReid

+1

“交集”变量未被声明,因此“结果”变量无法分配。我认为这将是'var intersection = x.filter(Set.prototype.has,new Set(y));' – Tuux

+0

谢谢!更新 – shotor

1

虽然更好的解决方案存在,如评论Potorr的答复中指出,与发布的代码唯一的问题是这样的:

var arrays = [ 
    [x], 
    [y] 
]; 

xy已经数组,这样你就不会需要[ ]来包装它们。代码工作,如果你简单地替换上面代码:

var arrays = [ 
    x, 
    y 
]; 

Updated demo