jQuery:如何比较每个索引中具有多个值的两个数组并删除重复项

3

我真的不知道怎么做。我想去掉一个有多个值的数组的重复值。我试过使用这篇文章中的代码 Compare arrays with jQuery [duplicate],但我没有得到我想要的结果。请帮助我解决这个问题。

var arr1 = ["1,2,3", "4,5", "6", "7,8", "9,10"];
var arr2 = ["2", "4", "7,8"];
var result = []; //expected output: Array["1,3","5","6","9,10"]

$.each(arr1, function(i, val) {
  if ($.inArray(val, arr2) < 0)
    result.push(val);
});
console.log(result);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


2
在两个数组中,你是故意忘记在逗号之间加上双引号的吗?或者像“arr1 []”(例如)应该像“1”,“2”,“3”,“4”,“5”...这样吗? - Zachary Dahan
不,先生,我的意思就是这样。数组中每个索引都将有多个用逗号分隔的值。然后,使用 .split() 方法,我可以将每个索引的值转换成一个数组。 - Mark Vincent Manjac
在您的示例中,如果arr2也包含“1”,您期望得到什么结果?(如果字符串中存在两个不同的arr2项,它们都会被删除吗?)如果arr2没有包含“2”,但却包含“1,3”,那将会怎样?(如果arr2有一项由逗号分隔的两个数字,它们必须相邻才能被删除,还是在字符串的任意位置都可以?) - S McCrohan
2个回答

3
如果性能不是非常重要的问题,那么这个做法会满足你的需求:
var arr1   = ["1,2,3", "4,5", "6", "7,8", "9,10"]
var arr2   = ["2", "4", "7,8"].join(',').split(',');
var result = [];

$.each(arr1, function(i, val) {
  var values   = val.split(',');
  var filtered = [];
  $.each(values, function (i, value) {
    if ($.inArray(value, arr2) === -1) {
      filtered.push(value);
    }
  });

  if (filtered.length) result.push(filtered.join(','));
});

0
首先,你需要将每个数字字符串拆分并将其作为整数添加到数组中。
然后,你可能想使用类似哈希映射的东西来高效地获取数组的交集。这个示例应该能够胜任。
以下是一个简单的示例。当然,你也需要拆分arr2并将其值添加到intersectMap中。
intersectMap = {}
for (i = 0; i < arr.length; i++) {
    var values = arr[1].split(",")
    // add these values to a hash map
    for (j = 0; j < values.length; j++) {
        intersectMap[values[j]] = values[j]
    }
}

你基本上需要遍历刚刚创建的每个数组(使用正确分割的字符串),将它们添加到哈希映射表(intersectMap)中,完成后将所有键添加到一个新数组中。这将确保您以最高效的时间获得唯一值的数组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接