使用另一个数组从数组中删除条目

问题描述 投票:1回答:7

不知道怎么做,所以任何帮助都非常感谢

说我有:

const array1 = [1, 1, 2, 3, 4];
const array2 = [1, 2];

期望的输出

const result = [1, 3, 4];

我希望比较array1array2以及array2中的每个条目,从array1中删除等效物。因此,如果我在array1中有3个1,在array2中有1个1,那么结果数组应该有2个1。

处理同时具有jquery和underscore.js的项目,如果这样可以更容易。

javascript jquery arrays underscore.js
7个回答
4
投票

var array1 = [1, 1, 2, 3, 4],
  array2 = [1, 2],
  result = array1.slice(0);

array2.forEach(function(element) {
  var index = result.indexOf(element)
  if (index >= 0) {
    result.splice(index, 1)
  }
})
console.log(result)

1
投票

这将运行得相当好。我认为它的线性时间而不是N * N.

function diffOnlyOncePerElementInstance(a1, a2) {
  const max = Math.max(a1.length, a2.length);
  const map = {};

  for (let i = 0; i < max; i++) {
    const valueA = a1[i];
    const valueB = a2[i];
    if (i < a1.length) {
      if (!Number.isInteger(map[valueA])) {
        map[valueA] = 0;
      }
      map[valueA]++;
    }
    if (i < a2.length) {
      if (!Number.isInteger(map[valueB])) {
        map[valueB] = 0;
      }
      map[valueB]--
    }
  }

  return Object.keys(map)
    .map(key => new Array(Math.abs(map[key])).fill(key)) // regenerate remaining count
    .reduce((a,b) => a.concat(b), []); // flatten
}

1
投票

使用array2作为对象而不是数组的IMO将是最高效的方式。

在第一次找到键时,我们更改了对象中的值,因此我们不会根据需要在输出中再次过滤该值。

const array1 = [1, 1, 2, 3, 4];
const array2 = Object.create(null,{
  1:{writable: true,value:false}, 
  2:{writable: true,value:false}
})


let op = array1.filter(e=> {
  if(array2[e] === false){
    array2[e] = true
    return false
  }
  return true
})

console.log(op)

旁注: - 使用qazxsw poi,我们正在创建一个没有原型的对象,因此它不会在完整的原型链中搜索值。


0
投票

您可以尝试以下方法。循环遍历array1并检查array1的元素是否存在于array1上并将其拼接出来。

object.create

0
投票

如果您打算使用大型阵列,此解决方案将表现良好。首先将const array1 = [1, 1, 2, 3, 4]; const array2 = [1, 2]; for(i=0;i<=array1.length;i++){ for(j=0;j<array2.length;j++){ if(array2[j] == array1[i]){ array1.splice(i,1); } } } console.log(array1);转换为array1,以便快速查找。然后通过Map并从你的array2中减去,表示该元素应该被删除。然后最后通过你的map并添加值大于map的键

0

0
投票

不确定在现代JS中实现这一目标的最有效方式,而且我很老了,所以这里是一个老派的解决方案:

const array1 = [1, 1, 2, 3, 4];
const array2 = [1, 2];

const obj = array1.reduce((acc, cv) => {
    if (acc.has(cv)) acc.set(cv, acc.get(cv) + 1);
    else acc.set(cv, 1);
    return acc;
}, new Map());

array2.forEach(i => {
    if (obj.has(i)) obj.set(i, obj.get(i) - 1);
});

const res = [];
obj.forEach((v, k) => { if (v) res.push(k); });
console.log(res)

0
投票

您可以使用 var array1 = [1, 1, 2, 3, 4]; var array2 = [1, 2]; // Note this method is destructive Array.prototype.removeFirstValueMatch = function(ar) { var indexesToRemoveAr = []; var indexesToRemoveOb = {}; for(var i=0, j; i<ar.length; i++) { for(j=0; j<this.length; j++) { if(this[j] == ar[i] && !indexesToRemoveOb.hasOwnProperty(j) ) { indexesToRemoveOb[j] = indexesToRemoveAr.length; indexesToRemoveAr.push(j); break; } } } var descending = indexesToRemoveAr.sort().reverse(); for(i=0; i<descending.length; i++) { this.splice(descending[i],1); } return this; }; // Destructive console.log(array1.removeFirstValueMatch(array2));//[1, 3, 4] console.log(array1.removeFirstValueMatch(array2));//[3, 4] // Non-Destructive var array1 = [1, 1, 2, 3, 4]; console.log(array1.slice(0).removeFirstValueMatch(array2));//[1, 3, 4] console.log(array1.slice(0).removeFirstValueMatch(array2));//[1, 3, 4]来计算要移除的物品。

Map
© www.soinside.com 2019 - 2024. All rights reserved.