删除两个数组javascript

时间:2019-02-21 09:26:15

标签: javascript arrays

我有一个函数可以删除javascript中两个数组之间的非公共元素,但是问题是我的代码减少了数组中的某些项目而增加了一些。下面是我的代码

function canFormPairs(cleanSocks, dirtySocks) {
  let compared = [];
  cleanSocks.forEach(item => {
    dirtySocks.forEach(dItem => {
      if (item == dItem) {
        compared.push(item);
      }
    });
  });
  return compared;
}
console.log(canFormPairs([1, 5, 6, 7, 5, 6, 5, 56], [1, 5, 6, 7, 8, 5, 6, 7, 8, 78]));

上面的代码给出

[ 1, 5, 5, 6, 6, 7, 7, 5, 5, 6, 6, 5, 5 ]

而不是预期的结果

[1, 1, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7]

排序时

请这段代码有什么问题

5 个答案:

答案 0 :(得分:6)

您当前的逻辑会在两个数组之间的每个唯一索引匹配中推送该项目。例如,对于7,在索引3(第一个数组)和索引3(第二个数组)处匹配7,因此将其压入一次。然后,下一个匹配项是索引3(第一个数组)和索引7(第二个数组)。除了3-33-7之外,没有其他 index 匹配项,因此只有两个7(值)被推送。

我会考虑从两个数组中创建一个Set,然后合并两个数组并使用.filter删除两个集合中都不存在的元素,然后对数组进行排序:

function canFormPairs(a, b) {
  const setA = new Set(a);
  const setB = new Set(b);
  return [...a, ...b]
    .filter(item => setA.has(item) && setB.has(item))
    .sort((a, b) => a - b);
}
console.log(canFormPairs([1, 5, 6, 7, 5, 6, 5, 56], [1, 5, 6, 7, 8, 5, 6, 7, 8, 78]));

答案 1 :(得分:0)

尝试

function canFormPairs(cleanSocks, dirtySocks) {
  let compared = [];
  let one = cleanSocks.filter(el => dirtySocks.includes(el));
  let two = dirtySocks.filter(el => cleanSocks.includes(el));
  compared = one.concat(two);
  compared.sort(function(a, b) {
    return a - b;
  });
  return compared;
}
console.log(canFormPairs([1, 5, 6, 7, 5, 6, 5, 56], [1, 5, 6, 7, 8, 5, 6, 7, 8, 78]));

答案 2 :(得分:0)

让这个答案集中在为什么OP的代码给出不正确的结果

您的算法读起来像

  • 具有2个数组,ab
  • a上循环。
  • b上循环。
  • 如果为a[i] === b[i],请按a[i]作为结果。

问题:

  • 结果数组中将有m*n个项目。因此对于1,由于两者都只有一次,因此您只有1次。同样,对于5,它的2*3则是6次,而不是5次。输出应为m+n instead
  • 两个数组都可以重复,并且不进行排序。因此最终结果将不会排序。

答案 3 :(得分:0)

我对您的功能进行了一些更改,现在可以使用:

function canFormPairs(cleanSocks, dirtySocks) {
    let compared = [];
    let cleanSocksUniqueItems = [];
    cleanSocks.map((item, index) => {
        cleanSocks.slice(index+1).map(elem => {
            if (item === elem && !cleanSocks.slice(0, index).includes(item)) {
               dirtySocks = [...dirtySocks, elem];
            }
        });
    });
    cleanSocksUniqueItems = Array.from(new Set(cleanSocks));
    cleanSocksUniqueItems.forEach(item => {
        dirtySocks.forEach(dItem => {
            if (item === dItem) {
                if (!compared.includes(item)) {
                    compared = [...compared, item];
                }
                compared = [...compared, item];
            }
        });
   });
   return compared.sort();
}
console.log(canFormPairs([1, 5, 6, 7, 5, 6, 5, 56], [1, 5, 6, 7, 8, 5, 6, 7, 8, 78]));

答案 4 :(得分:0)

这是使用.Sum(x => (int)x[CounterpartyFields.DEBT]); 的简单解决方案,请看一下。

flatMap