Javascript 使用两个数组创建一个变量,两个数组由两个.map()组成,用于查找匹配或交集

Javascript 使用两个数组创建一个变量,两个数组由两个.map()组成,用于查找匹配或交集,javascript,jquery,arrays,match,Javascript,Jquery,Arrays,Match,关键是我不是JS方面的专家,所以如果我的代码是一个大错误,请原谅,事实上我只是在训练,从网上的研究中学习制作一个巨大的“弗兰肯斯坦” 我想获取用户输入的两组或多组值,并将它们与js和jquery进行比较,以寻找匹配项 首先,我使用.map()从两组输入(按类区分)中获取值,这样就有了创建数组的值 var x = $(".row_a").map(function() { return this.value; }).get(); var y = $(".row_b").map(functio

关键是我不是JS方面的专家,所以如果我的代码是一个大错误,请原谅,事实上我只是在训练,从网上的研究中学习制作一个巨大的“弗兰肯斯坦”

我想获取用户输入的两组或多组值,并将它们与js和jquery进行比较,以寻找匹配项

首先,我使用.map()从两组输入(按类区分)中获取值,这样就有了创建数组的值

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

var y = $(".row_b").map(function() {
   return this.value;
}).get();
然后我尝试创建一个分别包含两个arrya的变量(这里是我认为有问题的时候),如果我使用数组,脚本的下一部分将按预期工作,但是如果我使用上面的前两个变量,脚本就会崩溃

var arrays = [
    [x],
    [y] 
  ];
在第三部分(我真的不太理解代码的这一部分)中,我运行脚本,比较第二个变量上的两个arry,然后用结果附加一个段落

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>");
var result=arrays.shift().reduce(函数(res,v){
if(res.indexOf(v)==-1&&array.every(函数a){
返回a.indexOf(v)!=-1;
}))res.push(v);
返回res;
}, []);
$(“.match”).append(“数字”+结果+“两个列表中的匹配”);
有人可以帮助我理解什么是错的,或者给我一个线索或链接可以帮助我

好奇:如果我在包含数组的变量中使用,脚本会工作并找到四个匹配项(我认为是正确的,因为比较相同的数组)

--

编辑:

多亏了@KarlReid和@Potorr。我不知道javascript中的交集概念,所以现在我知道了一种更好的方法来获得结果。我会读更多关于它的书,试着深入理解答案

感谢@Alexandru让我知道sintax错误,这将是非常基本和有用的

最终结果:


(我将编辑这篇文章的标题,以便在将来改进对具有相同问题的其他人的搜索。)

这很有效,在线解释:

$(".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>");
});
$(“.action”)。单击(函数(){
var x=$(“.row_a”).map(函数(){
返回此.value;
}).get()
变量y=$(“.row_b”).map(函数(){
返回此.value;
}).get()
//如果您愿意,这并不是真正需要的:
//x,y已经是数组了,所以不需要用[]
//变量数组=[
//x,,
//y
//];
//交叉口,改编自:https://stackoverflow.com/questions/1885557/simplest-code-for-array-intersection-in-javascript
//如果使用“arrays”变量,则将x更改为arrays[0],将y更改为arrays[1]
//var交点=x.filter(函数(n){
//返回y.indexOf(n)!=-1;
//});
//@KarlReid发布的交叉点功能实际上更好更快:
var intersection=x.filter(Set.prototype.has,新集合(y));
//创建结果字符串
var result=intersection.join(',')
$(“.match”).append(“数字”+结果+“两个列表中的匹配”);
});

编辑:将交叉点功能更改为@KarlReid发布的交叉点功能尽管存在更好的解决方案,正如Potorr回答中的评论所指出的,发布代码的唯一问题是:

var arrays = [
    [x],
    [y] 
];
x
y
已经是数组,因此不需要用
[]
包装它们。如果您只需将上述代码替换为:

var arrays = [
    x,
    y 
];

所以你只需要两个数组的交集(即,两个数组中出现的一组值)?是的,这是我期望的结果。如果你搜索“javascript数组交集”,我喜欢一个。交集变量没有声明,所以“result”变量不能赋值。我认为应该是
var intersection=x.filter(Set.prototype.has,new Set(y))