创建一个变量,其中包含两个由两个.map()组成的数组,用于查找匹配或交集

时间:2017-06-16 14:35:05

标签: javascript jquery arrays match

关键是我不是JS的专家,所以请原谅我,如果我的代码是一个很大的错误,事实上我只是训练学习制作一个巨大的" Frankenstein&# 34;来自网络上的研究。

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

首先,我从两组输入(与类不同)中获取值与.map(),这样就可以创建数组的值。

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

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

然后我要创建一个分别包含两个arryas的变量(这时我认为自己有问题)如果我" 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>");

有人可以帮我解释什么是错的,或者给出一些可以提供帮助的线索或链接?

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

DEMO

-

编辑:

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

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

最终结果:DEMO

(我将编辑该帖子的一小部分,以便在将来尝试使用相同的问题改进对其他人的搜索。)

2 个答案:

答案 0 :(得分:1)

这是有效的,在线说明:

$(".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 :(得分:1)

虽然存在更好的解决方案,正如Potorr的回答所指出的那样,发布的代码的唯一问题是:

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

xy已经是数组,因此您无需使用[ ]包装它们。如果您只是将上面的代码替换为:

,则代码可以正常工作
var arrays = [
    x,
    y 
];

Updated demo